OAuth 2.0
- OAuth,Open Authorization,是一种授权机制。用来分离第三方应用和资源数据。
- OAuth 2.0,是2012年对原始开放授权协议的重写,是当前授权软件的行业标准框架。
角色
- 资源所有者(Resource Owner):用户,可以授权应用获取账号信息。
- 资源服务器(Resource Server):保存账号信息等资源数据。
- 授权服务器(Authorization Server):验真身份及发放访问令牌。
- 客户端(Client):第三方应用。
令牌
- 资源所有者同意以后,资源服务器可以向客户端颁发令牌。客户端通过令牌,去请求数据。
- 令牌(token)特性
(1)令牌是短期有效的,到期会自动失效,用户自己无法修改。
(2)令牌是可控的,可以被数据所有者撤销,会立即失效。
(3)令牌是有权限范围的(scope)。 - 保证了令牌既可以让第三方应用获得权限,同时又随时可控,不会危及系统安全。这就是 OAuth 2.0 的优点。
- 只要知道了令牌,就能进入系统。系统一般不会再次确认身份,所以令牌必须保密,泄漏令牌与泄漏密码的后果是一样的。
模式
- 第三方应用申请令牌之前,都必须先到系统备案,说明自己的身份,会拿到两个身份识别码:客户端 ID(client ID)和客户端密钥(client secret)。
- OAuth 2.0 规定了四种获得令牌的流程
(1)授权码模式(authorization-code)
(2)隐式模式(implicit)
(3)密码模式(password):
(4)客户端凭证(client credentials) - 参数
(1)response_type:表示要求返回授权码(AC)
(2)client_id:说明是谁在请求
(3)redirect_uri:接受或拒绝授权后,重定向供用户访问的地址
(4)scope:表示要求的授权范围 - AC:Authorization Code
- AT:Access Token
- RT:Refresh Token
https://b.com/oauth/authorize?
response_type=code&
client_id=CLIENT_ID&
redirect_uri=CALLBACK_URL&
scope=read
授权码(Authorization Code)模式
- 授权码是通过授权服务器来获得的,授权服务器是客户端和资源拥有者之间的媒介。
- 流程
1、客户端构造了一个用于请求authorization code的URL并引导User-agent跳转访问。
2、客户端发送clientID、clientSecret、scope、redirect参数请求账号服务器获取AC。
3、账号服务器验证用户是否同意授权。
4、账号服务器返回AC到客户端。
5、客户端发送AC、clientID、clientSecret参数请求账号服务器获取AT、RT。
6、账号服务器返回AT、RT到客户端。
7、直到access token过期或失效之前,客户端可以通过资源服务器API访问用户的帐户,并具备scope中给定的操作权限。
8、AT过期后,后端可以通过RT获取新的AT。
隐式模式(implicit)
- 在隐式模式中,直接将AT颁发给Client,去除了发送AC的流程
- 可以提高某些客户端的响应能力和效率
- 流程
1、客户端构造了一个用于请求authorization code的URL并引导User-agent跳转访问。
2、客户端发送clientID、clientSecret、scope、redirect参数请求账号服务器获取AT
3、账号服务器返回AT到客户端
4、直到AT过期或失效之前,客户端可以通过资源服务器API访问用户的帐户,并具备scope中给定的操作权限。
密码模式(password)
- 客户端能够直接获取用户凭据(用户名和密码),进而访问服务器资源
- 流程
1、用户向客户端提供用户名与密码作为授权凭据。
2、客户端向授权服务器发送用户输入的授权凭据以请求 access token。
3、授权服务器对客户端进行认证并检验用户凭据的合法性,如果检验通过,将向客户端派发 access token
4、直到AT过期或失效之前,客户端可以通过资源服务器API访问用户的帐户,并具备scope中给定的操作权限。
客户端凭证(client credentials)
- 适用于没有前端的命令行应用,即在命令行下请求令牌
- 流程
1、客户端可以直接使用它的client credentials或其他有效认证信息向授权服务器发起获取access token的请求。
参考:
https://www.ruanyifeng.com/blog/2019/04/oauth_design.html
https://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html
https://www.cnblogs.com/Wddpct/p/8976480.html