一. OAuth2.0简介
OAuth2.0是一个标准, 开放标准, 允许用户让第三方应用访问该用户在某一网站的资源, 而无需将用户名和密码提供给第三方应用
二. OAuth2.0四种授权模式
- 授权码(认证码)模式(Authorization Code)
- 简化(隐形)模式(Impilict)
- 用户名密码(Resource Owner Password Credential)
- 客户端模式(Client Credential)
1. 授权码(认证码)模式(Authorization Code)
- 授权码模式是最完整,最严密的授权模式
- 主要是客户端后端娱认证服务器进行认证操作
- response_type=code
认证步骤:
![](https://img.haomeiwen.com/i14563032/ef17689a2ce3e777.png)
1.1 第2步中,客户端将用户导向认证服务器
客户端服务器请求参数如下:
参数 | 作用 | 是否必填 |
---|---|---|
reponse_type | 授权类型,授权码模式固定为code | Y |
client_id | 客户端ID | Y |
redirect_uri | 重定向URL | N |
scope | 权限申请范围 | N |
state | 客户端服务器状态, 认证服务器会原封不动的返回给客户端服务器 | N |
客户端服务器HTTP请求报文如下:
GET /authorize?response_type=code&client_id={client_id}&redirect_uri={redect_uri}&state={state} HTTP/1.1
Host: server.com
1.2 第4步中,认证服务器响应报文,将用户导向重定向URI
认证服务器响应参数如下:
参数 | 作用 | 是否必填 |
---|---|---|
code | 授权码,有效期一般为10分钟,只能使用一次,客户端服务器用来获取令牌 | Y |
state | 认证服务器返回的客户端服务器状态 | N |
认证服务器响应报文如下:
//浏览器会通过Location响应头进行重定向
HTTP/1.1 302 Found
Location: http://client.com/path?code={code}&state={state}
1.3 第5步中,客户端服务器向认证服务器申请令牌
客户端服务器请求参数如下:
参数 | 作用 | 是否必填 |
---|---|---|
grant_type | 授权模式,授权码模式固定为authorization_code | Y |
code | 认证服务器返回的code | Y |
redirect_uri | 第2步中的重定向URI | Y |
client_id | 客户端ID | Y |
客户端服务器请求报文:
POST /token HTTP/1.1
Host: server.com
grant_type=authorization_code&code={code}&redirect_uri={redirect_uri}&client_id={client_id}
1.4 第6步中,认证服务器响应客户端获取令牌请求
认证服务器响应参数如下:
参数 | 作用 | 是否必填 |
---|---|---|
access_token | 访问资源服务器的令牌 | Y |
token_type | 令牌的类型,可以是bearer或者mac等等 | Y |
expires_in | 令牌时长,单位为秒 | Y |
refresh_token | 更新令牌,用来获取下一个令牌 | N |
scope | 权限范围 | N |
认证服务器响应报文如下:
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
"access_token":"{access_token}",
"token_type":"bearer",
"expires_in":3600,
"refresh_token":"{token}"
}
2.简化(隐形)模式(Impilict)
- 不通过第三方应用程序,直接在浏览器中向认证服务器申请令牌
- 跳过了申请认证码的这一步
- 令牌是可见的
- 而且客户端服务器不需要认证
- reponse_type=token
认证步骤:
![](https://img.haomeiwen.com/i14563032/3e94bc2b570bb9fa.png)
2.1 第2步中,客户端将用户导向至认证服务器
客户端服务器请求参数如下:
参数 | 作用 | 是否必填 |
---|---|---|
reponse_type | 授权类型,授权码模式固定为token | Y |
client_id | 客户端ID | Y |
redirect_uri | 重定向URL | N |
scope | 权限申请范围 | N |
state | 客户端服务器状态, 认证服务器会原封不动的返回给客户端服务器 | N |
客户端服务器请求报文:
GET /authorize?response_type=token&client_id={client_id}&redirect_uri={redect_uri}&state={state} HTTP/1.1
Host: server.com
2.2 第4步中,认证服务器将用户导向至回调地址
认证服务器响应参数如下:
参数 | 作用 | 是否必填 |
---|---|---|
access_token | 访问资源服务器的令牌 | Y |
token_type | 令牌的类型,可以是bearer或者mac等等 | Y |
expires_in | 令牌时长,单位为秒 | Y |
scope | 权限范围 | N |
state | 认证服务器返回的客户端服务器状态 | N |
认证服务器响应报文:
HTTP/1.1 302 Found
Location: http://client.com/path#access_token={access_token}&token_type=bearer&state={state}&expires_in={expires_in}
2.3 第5步中,资源服务器重定向之后,资源服务器向客户端服务器发起请求,表示想获取URI中的token
2.4 第6步中,客户端服务器返回带有解析脚本的页面,解析重定向URI Hash(fragment,也就是#后面的部分)中的Access Token
3. 用户名密码模式(Resource Owner Password Credential)
- grant_type=password
认证步骤:
![](https://img.haomeiwen.com/i14563032/3ad0cced6214fccf.png)
3.1 第1步中,客户端向认证服务器请求令牌
客户端服务器请求参数如下:
参数 | 作用 | 是否必填 |
---|---|---|
reponse_type | 授权类型,简化模式固定为password | Y |
username | 用户名 | Y |
password | 密码 | Y |
scope | 权限申请范围 | N |
客户端服务器请求报文:
POST /token HTTP/1.1
Host: server.com
grant_type=password&username={username}&password={password}
3.2 第2步中,认证服务器响应客户端
认证服务器响应参数如下:
参数 | 作用 | 是否必填 |
---|---|---|
access_token | 访问资源服务器的令牌 | Y |
token_type | 令牌的类型,可以是bearer或者mac等等 | Y |
expires_in | 令牌时长,单位为秒 | Y |
refresh_token | 更新令牌,用来获取下一个令牌 | N |
scope | 权限范围 | N |
认证服务器响应报文如下:
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
"access_token":"{access_token}",
"token_type":"bearer",
"expires_in":3600,
"refresh_token":"{token}"
}
4. 客户端模式(Client Credential)
-
grant_type=client_credential
http_outh2_client.png
网友评论