|
| 1 | +--- |
| 2 | +date: "2019-04-19:44:00+01:00" |
| 3 | +title: "OAuth2 提供者" |
| 4 | +slug: "oauth2-provider" |
| 5 | +weight: 41 |
| 6 | +toc: false |
| 7 | +draft: false |
| 8 | +menu: |
| 9 | + sidebar: |
| 10 | + parent: "development" |
| 11 | + name: "OAuth2 提供者" |
| 12 | + weight: 41 |
| 13 | + identifier: "oauth2-provider" |
| 14 | +--- |
| 15 | + |
| 16 | +# OAuth2 提供者 |
| 17 | + |
| 18 | +**目录** |
| 19 | + |
| 20 | +{{< toc >}} |
| 21 | + |
| 22 | +Gitea 支持作为 OAuth2 提供者,允许第三方应用程序在用户同意的情况下访问其资源。此功能自 1.8.0 版起可用。 |
| 23 | + |
| 24 | +## 端点 |
| 25 | + |
| 26 | +| 端点 | URL | |
| 27 | +| ------------------------ | ----------------------------------- | |
| 28 | +| OpenID Connect Discovery | `/.well-known/openid-configuration` | |
| 29 | +| Authorization Endpoint | `/login/oauth/authorize` | |
| 30 | +| Access Token Endpoint | `/login/oauth/access_token` | |
| 31 | +| OpenID Connect UserInfo | `/login/oauth/userinfo` | |
| 32 | +| JSON Web Key Set | `/login/oauth/keys` | |
| 33 | + |
| 34 | +## 支持的 OAuth2 授权 |
| 35 | + |
| 36 | +目前 Gitea 仅支持 [**Authorization Code Grant**](https://tools.ietf.org/html/rfc6749#section-1.3.1) 标准,并额外支持以下扩展: |
| 37 | + |
| 38 | +- [Proof Key for Code Exchange (PKCE)](https://tools.ietf.org/html/rfc7636) |
| 39 | +- [OpenID Connect (OIDC)](https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth) |
| 40 | + |
| 41 | +要将 Authorization Code Grant 作为第三方应用程序,您需要通过在设置中添加一个新的 "应用程序" (`/user/settings/applications`)。 |
| 42 | + |
| 43 | +## 范围 |
| 44 | + |
| 45 | +Gitea 支持以下令牌范围: |
| 46 | + |
| 47 | +| 名称 | 介绍 | |
| 48 | +| ---- | ----------- | |
| 49 | +| **(no scope)** | 授予对公共用户配置文件和公共存储库的只读访问权限 | |
| 50 | +| **repo** | 完全控制所有存储库 | |
| 51 | +| **repo:status** | 授予对所有存储库中提交状态的读/写访问权限 | |
| 52 | +| **public_repo** | 仅授予对公共存储库的读/写访问权限 | |
| 53 | +| **admin:repo_hook** | 授予对所有存储库的 Hooks 访问权限,该权限已包含在 `repo` 范围中 | |
| 54 | +| **write:repo_hook** | 授予对存储库 Hooks 的读/写访问权限 | |
| 55 | +| **read:repo_hook** | 授予对存储库 Hooks 的只读访问权限 | |
| 56 | +| **admin:org** | 授予对组织设置的完全访问权限 | |
| 57 | +| **write:org** | 授予对组织设置的读/写访问权限 | |
| 58 | +| **read:org** | 授予对组织设置的只读访问权限 | |
| 59 | +| **admin:public_key** | 授予公钥管理的完全访问权限 | |
| 60 | +| **write:public_key** | 授予对公钥的读/写访问权限 | |
| 61 | +| **read:public_key** | 授予对公钥的只读访问权限 | |
| 62 | +| **admin:org_hook** | 授予对组织级别 Hooks 的完全访问权限 | |
| 63 | +| **admin:user_hook** | 授予对用户级别 Hooks 的完全访问权限 | |
| 64 | +| **notification** | 授予对通知的完全访问权限 | |
| 65 | +| **user** | 授予对用户个人资料信息的完全访问权限 | |
| 66 | +| **read:user** | 授予对用户个人资料的读取权限 | |
| 67 | +| **user:email** | 授予对用户电子邮件地址的读取权限 | |
| 68 | +| **user:follow** | 授予访问权限以关注/取消关注用户 | |
| 69 | +| **delete_repo** | 授予删除存储库的权限 | |
| 70 | +| **package** | 授予对托管包的完全访问权限 | |
| 71 | +| **write:package** | 授予对包的读/写访问权限 | |
| 72 | +| **read:package** | 授予对包的读取权限 | |
| 73 | +| **delete:package** | 授予对包的删除权限 | |
| 74 | +| **admin:gpg_key** | 授予 GPG 密钥管理的完全访问权限 | |
| 75 | +| **write:gpg_key** | 授予对 GPG 密钥的读/写访问权限 | |
| 76 | +| **read:gpg_key** | 授予对 GPG 密钥的只读访问权限 | |
| 77 | +| **admin:application** | 授予应用程序管理的完全访问权限 | |
| 78 | +| **write:application** | 授予应用程序管理的读/写访问权限 | |
| 79 | +| **read:application** | 授予应用程序管理的读取权限 | |
| 80 | +| **sudo** | 允许以站点管理员身份执行操作 | |
| 81 | + |
| 82 | +## 客户端类型 |
| 83 | + |
| 84 | +Gitea 支持私密和公共客户端类型,[参见 RFC 6749](https://datatracker.ietf.org/doc/html/rfc6749#section-2.1). |
| 85 | + |
| 86 | +对于公共客户端, 允许在本地回环地址的重定向 URI 中使用任意端口,例如 `http://127.0.0.1/`。根据 [RFC 8252 的建议](https://datatracker.ietf.org/doc/html/rfc8252#section-8.3),请避免使用 `localhost`。 |
| 87 | + |
| 88 | +## 示例 |
| 89 | + |
| 90 | +**注意:** 该示例中尚未使用 PKCE。 |
| 91 | + |
| 92 | +1. 将用户重定向到授权端点,以获得他们的访问资源授权: |
| 93 | + |
| 94 | + ```curl |
| 95 | + https://[YOUR-GITEA-URL]/login/oauth/authorize?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI& response_type=code&state=STATE |
| 96 | + ``` |
| 97 | + |
| 98 | + 在设置中注册应用程序以获得 `CLIENT_ID`。`STATE` 是一个随机字符串,它将在获得用户授权后发送回您的应用程序。`state` 参数是可选的,但您应该使用它来防止 CSRF 攻击。 |
| 99 | + |
| 100 | +  |
| 101 | + |
| 102 | + 用户将会被询问是否授权给您的应用程序。如果他们同意了授权,用户将会被重定向到 `REDIRECT_URL`,例如: |
| 103 | + |
| 104 | + ```curl |
| 105 | + https://[REDIRECT_URI]?code=RETURNED_CODE&state=STATE |
| 106 | + ``` |
| 107 | + |
| 108 | +2. 使用重定向提供的 `code`,您可以请求一个新的应用程序和 Refresh Token。Access Token Endpoint 接受 `application/json` 或 `application/x-www-form-urlencoded` 类型的 POST 请求,例如: |
| 109 | + |
| 110 | + ```curl |
| 111 | + POST https://[YOUR-GITEA-URL]/login/oauth/access_token |
| 112 | + ``` |
| 113 | + |
| 114 | + ```json |
| 115 | + { |
| 116 | + "client_id": "YOUR_CLIENT_ID", |
| 117 | + "client_secret": "YOUR_CLIENT_SECRET", |
| 118 | + "code": "RETURNED_CODE", |
| 119 | + "grant_type": "authorization_code", |
| 120 | + "redirect_uri": "REDIRECT_URI" |
| 121 | + } |
| 122 | + ``` |
| 123 | + |
| 124 | + 返回: |
| 125 | + |
| 126 | + ```json |
| 127 | + { |
| 128 | + "access_token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJnbnQiOjIsInR0IjowLCJleHAiOjE1NTUxNzk5MTIsImlhdCI6MTU1NTE3NjMxMn0.0-iFsAwBtxuckA0sNZ6QpBQmywVPz129u75vOM7wPJecw5wqGyBkmstfJHAjEOqrAf_V5Z-1QYeCh_Cz4RiKug", |
| 129 | + "token_type": "bearer", |
| 130 | + "expires_in": 3600, |
| 131 | + "refresh_token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJnbnQiOjIsInR0IjoxLCJjbnQiOjEsImV4cCI6MTU1NzgwNDMxMiwiaWF0IjoxNTU1MTc2MzEyfQ.S_HZQBy4q9r5SEzNGNIoFClT43HPNDbUdHH-GYNYYdkRfft6XptJBkUQscZsGxOW975Yk6RbgtGvq1nkEcklOw" |
| 132 | + } |
| 133 | + ``` |
| 134 | + |
| 135 | + `CLIENT_SECRET` 是生成给应用程序的唯一密钥。请注意,该密钥只会在您使用 Gitea 创建/注册应用程序后出现一次。如果您丢失了密钥,您必须在应用程序设置中重新生成密钥。 |
| 136 | + |
| 137 | + `access_token` 请求中的 `REDIRECT_URI` 必须与 `authorize` 请求中的 `REDIRECT_URI` 相符。 |
| 138 | + |
| 139 | +3. 使用 `access_token` 来构造 [API 请求](https://docs.gitea.io/en-us/api-usage#oauth2) 以读写用户的资源。 |
0 commit comments