OAuth 2.0
OAuth 2.0是行业标准的授权协议,为Web应用程序,桌面应用程序,移动电话和客厅设备提供特定的授权流程。
OAuth 2.0授权框架支持第三方,应用程序以获取对HTTP服务的有限访问权限,代表资源所有者通过编排批准交互,资源所有者和HTTP服务之间,或通过允许,第三方应用程序以代表自己获取访问权限。
OAuth 2.0授权类型
授权码(Authorization Code) 机密和公共客户端使用授权代码授权类型来交换访问令牌的授权代码
包含两步1获取授权码;2获取交换令牌;
获取授权码
ps :https://authorization-server.com/auth?response_type=code&client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&scope=photos&state=1234zyx
response_type = code - 表示您的服务器希望收到授权代码
client_id - 首次创建应用程序时收到的客户端ID
redirect_uri - 表示授权完成后返回用户的URI
范围 - 一个或多个范围值,指示您要访问的用户帐户的哪些部分
state - 由您的应用程序生成的随机字符串,稍后您将验证该字符串
如果用户单击“允许”,则服务会使用身份验证代码将用户重定向回您的站点
https://example-app.com/cb?code=AUTH_CODE_HERE&state=1234zyx code - 服务器返回查询字符串中的授权代码
state - 服务器返回您传递的相同状态值
您应首先比较此状态值以确保它与您开始时的状态匹配。您通常可以将状态值存储在cookie或会话中,并在用户返回时进行比较。这可确保您的重定向端点无法欺骗尝试交换任意授权代码。
获取交换令牌
请求参数
grant_type = authorization_code - 此流的授权类型是authorization_code
code = AUTH_CODE_HERE - 这是您在查询字符串中收到的代码
redirect_uri = REDIRECT_URI - 必须与原始链接中提供的重定向URI相同
client_id = CLIENT_ID - 首次创建应用程序时收到的客户端ID
client_secret = CLIENT_SECRET - 由于此请求是从服务器端代码发出的,因此包含了密码
隐式授权(Implicit)隐式授权类型是公共客户端可以使用的简化流,其中访问令牌立即返回,无需额外的授权代码交换步骤。通常不建议使用隐式流(并且一些服务器完全禁止此流程)
密码授予(Password) 可用于直接交换访问令牌的用户名和密码
ps : POST https://api.authorization-server.com/token
grant_type=password&
username=USERNAME&
password=PASSWORD&
client_id=CLIENT_ID
&client_secret=xxxxxxxxxx
grant_type = password - 此流的授权类型为password
username = USERNAME - 应用程序收集的用户的用户名
password = PASSWORD - 应用程序收集的用户密码
client_id = CLIENT_ID - 首次创建应用程序时收到的客户端ID
客户端凭据(Client Credentials) 当应用程序请求访问令牌访问其自己的资源而不是代表用户访问时,将使用客户端凭据授予
ps: POST https://api.authorization-server.com/token
grant_type=client_credentials&
client_id=CLIENT_ID&
client_secret=CLIENT_SECRET
grant_type=client_credentials grant_type参数必须设置为client_credentials
client_id=xxxxxxxxxx
client_secret=xxxxxxxxxx
设备代码 (Device Code) 设备代码授权类型由设备流中的无浏览器或输入受限设备使用,以交换先前获得的访问令牌的设备代码。
刷新令牌 (Refresh Token) 当访问令牌过期时,客户端使用刷新令牌授权类型来交换访问令牌的刷新令牌
grant_type=refresh_token
refresh_token=xxxxxxxxxxx 获取access_token时发布给客户端的刷新令牌
client_id=xxxxxxxxxx
client_secret=xxxxxxxxxx
正常返回响应格式
{
"access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3",
"token_type":"bearer",
"expires_in":3600,
"refresh_token":"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk",
"scope":"create"
}
错误时的响应
{
"error": "invalid_request",
"error_description": "Request was missing the 'redirect_uri' parameter.",
"error_uri": "See the full API docs at https://authorization-server.com/docs/access_token"
}