本文来源:https://gitee.com/api/v5/oauth_doc#/
引言
笔者看了大半天的spring-security开发文档中关于使用oauth2 协议中的授权码模式对第三方应用授权客户端的登录认证部分,发现目前只提供配置四种 OAuth2 认证服务器:
- google 的 oauth2 认证服务器
- github 的 oauth2 认证服务器
- facebook 的 oauth2 认证服务器
- 自定义 oauth2 认证服务器的 okta
其中 google、github、facebook 和 okta
会在自动配置类中被设置成 ClientRegistration
实例中的 registrationId
字段。前三种方式在 CommonOAuth2Provid
类中自动配置了开启auth2 授权认证所需要的ClientRegistration
实例中的 authorizationUri、tokenUri和userInfoUri
等字段值。第四种方式需要开发者自己配置第三方认认证服务或自己开发的资源认证服务器的以上字段值。而国内用户如果没有设置网络翻墙,对于使用 google、github 和 facebook
的账号认证服务并不是很方便。像笔者就只有一个github账号,而且还没有创建第三方应用的权限。而国内用户使用 gitee 作为第三方应用授权客户端登陆就方便多了。
为了构建更好的码云生态环境,gitee 推出了基于OAuth2
的API V5版本。API V5接口使用方式以及Url都参照GitHub
,为了各位开发者更好的兼容已经存在的第三方应用。可以说这是国内开发者的一大福音。下面让我们跟随官方文档看看它的具体用法。
API 使用条款
- OSCHINA 用户是资源的拥有者,需尊重和保护用户的权益
- 不能在应用中使用 OSCHINA 的名称
- 未经用户允许,不准爬取或存储用户的资源
- 禁止滥用 API,请求频率过快将导致请求终止
OAuth2 认证基本流程
OAuth2 获取 AccessToken 认证步骤
1. 授权码模式
(1) 应用通过浏览器 或 Webview 将用户引导到码云三方认证页面上( GET请求 )
代码语言:javascript复制https://gitee.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code
(2) 用户对应用进行授权
注意: 如果之前已经授权过的需要跳过授权页面,需要在上面第一步的 URL 加上 scope 参数,且 scope 的值需要和用户上次授权的勾选的一致。如用户在上次授权了user_info、projects以及pull_requests。则步骤A 中 GET 请求应为:
代码语言:javascript复制https://gitee.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code&scope=user_info projects pull_requests
(3) 码云认证服务器通过回调地址{redirect_uri}将 用户授权码 传递给 应用服务器 或者直接在 Webview 中跳转到携带 用户授权码的回调地址上,Webview 直接获取code即可({redirect_uri}?code=abc&state=xyz)
(4) 应用服务器 或 Webview 使用 access_token API 向 码云认证服务器发送post请求传入 用户授权码 以及 回调地址( POST请求 ) 注:请求过程建议将 client_secret 放在 Body 中传值,以保证数据安全
代码语言:javascript复制https://gitee.com/oauth/token?grant_type=authorization_code&code={code}&client_id={client_id}&redirect_uri={redirect_uri}&client_secret={client_secret}
(5) 码云认证服务器返回 access_token
应用通过 access_token 访问 Open API 使用用户数据
(6) 当 access_token 过期后(有效期为一天),你可以通过以下 refresh_token 方式重新获取 access_token( POST请求 )
代码语言:javascript复制https://gitee.com/oauth/token?grant_type=refresh_token&refresh_token={refresh_token}
注意:如果获取 access_token 返回 403,可能是没有设置User-Agent的原因。详见:获取Token时服务端响应状态403是什么情况
2. 密码模式
(1) 用户向客户端提供邮箱地址和密码。客户端将邮箱地址和密码发给码云认证服务器,并向码云认证服务器请求令牌。( POST请求。Content-Type: application/x-www-form-urlencoded )
代码语言:javascript复制curl -X POST --data-urlencode "grant_type=password" --data-urlencode "username={email}" --data-urlencode "password={password}" --data-urlencode "client_id={client_id}" --data-urlencode "client_secret={client_secret}" --data-urlencode "scope=projects user_info issues notes" https://gitee.com/oauth/token
scope表示权限范围,有以下选项,请求时使用空格隔开
代码语言:javascript复制user_info projects pull_requests issues notes keys hook groups gists enterprises
(2) 码云认证服务器返回 access_token 应用通过 access_token
访问 Open API 使用用户数据
创建应用流程
(1) 在 修改资料 -> 第三方应用,创建要接入码云的应用。
(2) 填写应用相关信息,勾选应用所需要的权限。其中: 回调地址是用户授权后,码云回调到应用,并且回传授权码的地址。
(3) 创建成功后,会生成 Cliend ID 和 Client Secret。他们将会在上述OAuth2 认证基本流程用到
参考链接
gitee oauth2文档
--END--