OAuth2.0
1. 概述
OAuth2.0是从2006年开始设计OAuth协议的下一个版本,OAuth2.0同时提供Web,桌面和移动应用程序的支持,并较1.0相比整个授权验证流程更简单更安全。
2. 基本流程
开发者可以先浏览OAuth2.0的接口,熟悉OAuth2的接口及参数的含义,然后我们根据应用场景各自说明如何使用OAuth2.0
3. 应用场景
- Authorization Code授权码方式(WEB、桌面、移动场景)
左A 由应用发起,通过引导用户至授权端点
左B 用户看到登录界面
左C 用户登录成功后应用得到授权码信息
A 应用向授权服务器请求授权,验证应用ID、回调地址等,成功引导至授权端点或失败返回错误码。
B 当用户未登录过,用户输入用户名和密码登录,授权服务器验证用户名和密码;当用户登录过,用户确认授权,授权服务器授受响应
C 用户验证成功或确认授权后,重定向至回调地址并返回授权码;用户验证失败,返回登录界面让用户重新输入。
D 应用向授权服务器请求获取授权,授权服务器验证授权码、应用ID、回调地址及应用密钥等
E 验证成功返回访问令牌,或有刷新令牌。
- 引导需要授权的用户到如下地址
${SSO_API_URI}/authorize.php?client_id=${YOUR_CLIENT_ID}&response_type=code&redirect_uri=${YOUR_REGISTERED_REDIRECT_URI}&state=${YOUR_STATE}
- 如果用户同意授权,页面跳转至
${YOUR_REGISTERED_REDIRECT_URI}/?code=${CODE}&state=${YOUR_STATE}
- 接入应用服务器端调用令牌接口获取Access Token
${SSO_API_URI}/token.php?client_id=${YOUR_CLIENT_ID}&client_secret=${YOUR_CLIENT_SECRET}&grant_type=authorization_code&redirect_uri=${YOUR_REGISTERED_REDIRECT_URI}&code=${CODE}
返回值
{
"access_token":"02c932bb9ef889e76070bafe337c5b6e",
"expires_in":3600
}
- 使用获得的OAuth2.0 Access Token调用其他API
- Implicit Grant隐式授权(无服务端场景)
左A 由应用发起,通过引导用户至授权端点
左B 用户看到登录界面
A 应用向授权服务器请求授权,验证应用ID、回调地址等,成功引导至授权端点或失败返回错误码。
B 当用户未登录过,用户输入用户名和密码登录,授权服务器验证用户名和密码;当用户登录过,用户确认授权,授权服务器授受响应。
C 用户验证成功或确认授权后,重定向至回调地址并在哈希中返回授权码;用户验证失败,返回登录界面让用户重新输入。
D 接收地址中哈希片段中携带的访问令牌,并重定向至无哈希的回调地址。
E 执行脚本解析出访问令牌。
F 用户代理器保存访问令牌。
G 应用可获取保存在用户代理器中访问令牌。
- 引导需要授权的用户到如下地址:
${SSO_API_URI}/authorize.php?client_id=${YOUR_CLIENT_ID}&response_type=token&redirect_uri=${YOUR_REGISTERED_REDIRECT_URI}&state=${YOUR_STATE}
- 如果用户同意授权,页面跳转至:
${YOUR_REGISTERED_REDIRECT_URI}/#access_token=${ACCESS_TOKEN}&expires_in=${ACCESS_TOKEN_EXPIRE_IN}&state=${YOUR_STATE}
- 获取地址上的Access token,使用javascript或其他获取access_token
<script type="text/javascript" >
//解析hash得到access_token值。
var hash = document.location.hash.substring(1);
</script>
- 使用获得的OAuth2.0 Access token调用API
- Resource Owner Password Credentials资源所有者密码证书授权(特殊设备场景)
A 应用接收用户输入的用户名和密码。
B 应用使用户名和密码证书向授权服务器获取授权。
C 验证成功返回访问令牌或有刷新令牌,失败返回错误码。
- 调用接口
${SSO_API_URI}/token.php?client_id=${YOUR_CLIENT_ID}&client_secret=${YOUR_CLIENT_SECRET}&grant_type=password&username=${USERNAME}&password=${PASSWORD}
返回值
{
"access_token":"02c932bb9ef889e76070bafe337c5b6e",
"expires_in":3600
}
- 使用获得的OAuth2.0 Access Token调用API
4. 接口
参见这里
5. 错误码
- 授权服务器在接收到验证授权请求时,会按照OAuth2.0协议对本请求的请求头部、请求参数进行检验,若请求不合法或验证未通过,授权服务器会返回相应的错误信息,例如:
{
"error":"invalid_request"
}
- error – 错误码
- OAuth2.0错误响应中的错误码定义如下表所示
- invalid_request 请求不合法
- invalid_client client_id或client_secret或redirect_uri参数不合法
- invalid_grant 提供的Access grant是无效的、过期的或已撤销的
- invalid_token 提供的Access token或Refresh token是无效的、过期的或已撤销的
- unsupported_response_type 不支持的 Response type
- unsupported_grant_type 不支持的 Grant type