OAuth2 提供者

Gitea 支持作为 OAuth2 提供者,允许第三方应用程序在用户同意的情况下访问其资源。此功能自 1.8.0 版起可用。

端点

端点URL
OpenID Connect Discovery/.well-known/openid-configuration
Authorization Endpoint/login/oauth/authorize
Access Token Endpoint/login/oauth/access_token
OpenID Connect UserInfo/login/oauth/userinfo
JSON Web Key Set/login/oauth/keys

支持的 OAuth2 授权

目前 Gitea 仅支持 Authorization Code Grant 标准,并额外支持以下扩展:

要将 Authorization Code Grant 作为第三方应用程序,您需要通过在设置中添加一个新的 “应用程序” (/user/settings/applications)。

范围

Gitea 支持以下令牌范围:

名称介绍
(no scope)授予对公共用户配置文件和公共存储库的只读访问权限
repo完全控制所有存储库
    repo:status授予对所有存储库中提交状态的读/写访问权限
    public_repo仅授予对公共存储库的读/写访问权限
admin:repo_hook授予对所有存储库的 Hooks 访问权限,该权限已包含在 repo 范围中
    write:repo_hook授予对存储库 Hooks 的读/写访问权限
    read:repo_hook授予对存储库 Hooks 的只读访问权限
admin:org授予对组织设置的完全访问权限
    write:org授予对组织设置的读/写访问权限
    read:org授予对组织设置的只读访问权限
admin:public_key授予公钥管理的完全访问权限
    write:public_key授予对公钥的读/写访问权限
    read:public_key授予对公钥的只读访问权限
admin:org_hook授予对组织级别 Hooks 的完全访问权限
admin:user_hook授予对用户级别 Hooks 的完全访问权限
notification授予对通知的完全访问权限
user授予对用户个人资料信息的完全访问权限
    read:user授予对用户个人资料的读取权限
    user:email授予对用户电子邮件地址的读取权限
    user:follow授予访问权限以关注/取消关注用户
delete_repo授予删除存储库的权限
package授予对托管包的完全访问权限
    write:package授予对包的读/写访问权限
    read:package授予对包的读取权限
    delete:package授予对包的删除权限
admin:gpg_key授予 GPG 密钥管理的完全访问权限
    write:gpg_key授予对 GPG 密钥的读/写访问权限
    read:gpg_key授予对 GPG 密钥的只读访问权限
admin:application授予应用程序管理的完全访问权限
    write:application授予应用程序管理的读/写访问权限
    read:application授予应用程序管理的读取权限
sudo允许以站点管理员身份执行操作

客户端类型

Gitea 支持私密和公共客户端类型,参见 RFC 6749.

对于公共客户端, 允许在本地回环地址的重定向 URI 中使用任意端口,例如 http://127.0.0.1/。根据 RFC 8252 的建议,请避免使用 localhost

示例

注意: 该示例中尚未使用 PKCE。

  1. 将用户重定向到授权端点,以获得他们的访问资源授权:

    1. https://[YOUR-GITEA-URL]/login/oauth/authorize?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI& response_type=code&state=STATE

    在设置中注册应用程序以获得 CLIENT_IDSTATE 是一个随机字符串,它将在获得用户授权后发送回您的应用程序。state 参数是可选的,但您应该使用它来防止 CSRF 攻击。

    Authorization Page

    用户将会被询问是否授权给您的应用程序。如果他们同意了授权,用户将会被重定向到 REDIRECT_URL,例如:

    1. https://[REDIRECT_URI]?code=RETURNED_CODE&state=STATE
  2. 使用重定向提供的 code,您可以请求一个新的应用程序和 Refresh Token。Access Token Endpoint 接受 application/jsonapplication/x-www-form-urlencoded 类型的 POST 请求,例如:

    1. POST https://[YOUR-GITEA-URL]/login/oauth/access_token
    1. {
    2. "client_id": "YOUR_CLIENT_ID",
    3. "client_secret": "YOUR_CLIENT_SECRET",
    4. "code": "RETURNED_CODE",
    5. "grant_type": "authorization_code",
    6. "redirect_uri": "REDIRECT_URI"
    7. }

    返回:

    1. {
    2. "access_token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJnbnQiOjIsInR0IjowLCJleHAiOjE1NTUxNzk5MTIsImlhdCI6MTU1NTE3NjMxMn0.0-iFsAwBtxuckA0sNZ6QpBQmywVPz129u75vOM7wPJecw5wqGyBkmstfJHAjEOqrAf_V5Z-1QYeCh_Cz4RiKug",
    3. "token_type": "bearer",
    4. "expires_in": 3600,
    5. "refresh_token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJnbnQiOjIsInR0IjoxLCJjbnQiOjEsImV4cCI6MTU1NzgwNDMxMiwiaWF0IjoxNTU1MTc2MzEyfQ.S_HZQBy4q9r5SEzNGNIoFClT43HPNDbUdHH-GYNYYdkRfft6XptJBkUQscZsGxOW975Yk6RbgtGvq1nkEcklOw"
    6. }

    CLIENT_SECRET 是生成给应用程序的唯一密钥。请注意,该密钥只会在您使用 Gitea 创建/注册应用程序后出现一次。如果您丢失了密钥,您必须在应用程序设置中重新生成密钥。

    access_token 请求中的 REDIRECT_URI 必须与 authorize 请求中的 REDIRECT_URI 相符。

  3. 使用 access_token 来构造 API 请求 以读写用户的资源。