OAuth2.0


1. 概述

OAuth2.0是从2006年开始设计OAuth协议的下一个版本,OAuth2.0同时提供Web,桌面和移动应用程序的支持,并较1.0相比整个授权验证流程更简单更安全。

2. 基本流程

基本流程

开发者可以先浏览OAuth2.0的接口,熟悉OAuth2的接口及参数的含义,然后我们根据应用场景各自说明如何使用OAuth2.0

3. 应用场景

  1. Authorization Code授权码方式(WEB、桌面、移动场景)

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
  1. Implicit Grant隐式授权(无服务端场景)

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
  1. Resource Owner Password Credentials资源所有者密码证书授权(特殊设备场景)

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. 错误码

  1. 授权服务器在接收到验证授权请求时,会按照OAuth2.0协议对本请求的请求头部、请求参数进行检验,若请求不合法或验证未通过,授权服务器会返回相应的错误信息,例如:
{
  "error":"invalid_request"
}
  • error – 错误码
  1. 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