一文搞懂OAuth2.0授权协议是怎么回事( 三 )


四. OAuth2.0授权方式(重点)讲解完了OAuth2.0的授权流程,接下来壹哥再给大家介绍另一个重要概念,即OAuth2.0的授权方式 。
在RFC 6749标准中定义了获得令牌的四种授权方式(authorization grant),即 OAuth2.0 有四种获得令牌的方式,我们开发时可以选择最适合自己的那一种,向第三方应用颁发令牌,这四种授权方式如下:

  • 授权码模式(authorization code)
  • 简化模式(implicit)
  • 密码模式(resource owner password credentials)
  • 客户端模式(client credentials)
1. 授权码模式授权码模式(authorization code),指的是第三方应用先申请一个授权码,然后再用该授权码获取访问令牌的方式 。这种方式是功能最完整、流程最严密的授权模式,也是开发时最常用,安全性最高的授权模式,适用于那些有后端的 Web 应用,比如我们前面介绍的以QQ信息登录到CSDN网站上就是采用授权码模式 。授权码由前端发起申请,令牌则储存在后端,而且所有与资源服务器的通信都在后端完成,这样前后端分离,可以避免令牌泄漏 。授权码模式执行流程可以分为如下4步:
一文搞懂OAuth2.0授权协议是怎么回事

文章插图
 
接下来我把这4步再分开详细说明一下 。
(1). 用户请求客户端A,由客户端A将用户导向认证服务器B请求授权码,假设用户同意授权,认证服务器B会将用户导向客户端A事先指定的"重定向URI"(redirection URI),同时附上一个授权码 。
https://b.com/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read比如我们前面利用QQ进行登录到CSDN网站时,获取code授权码的url:
https://graph.qq.com/oauth2.0/show?which=Login&display=pc&client_id=100270988899&response_type=code&redirect_uri=https://passport.csdn.net/account/login?pcAuthType=qq&state=test
  • response_type:授权类型,必选项,为固定值code;
  • client_id: 客户端id,必选项,表示告诉 认证服务器B 是谁在发起请求;
  • redirect_uri:可选项,是 认证服务器B 接受或拒绝请求后的回调网址;
  • scope:可选项,表示要求的授权范围(这里是只读);
  • state: 客户端状态 。
(2). 客户端A收到授权码code,附上之前的"重定向URI"参数,向认证服务器B申请令牌:GET /oauth/token?response_type=code&client_id=test&redirect_uri=重定向页面链接,请求成功后返回code授权码,一般有效时间是10分钟 。
https://a.com/callback?code=AUTHORIZATION_CODE(3). 客户端A向认证服务器B发起申请令牌的请求,B会核对授权码和重定向URI,确认无误后,向客户端A返回访问令牌(access token)和更新令牌(refresh token),POST /oauth/token?response_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=重定向页面链接 。
https://b.com/oauth/token? client_id=CLIENT_ID& client_secret=CLIENT_SECRET& grant_type=authorization_code& code=AUTHORIZATION_CODE& redirect_uri=CALLBACK_URL(4). 认证服务器B 收到请求以后,就会颁发令牌,向redirect_uri指定的网址,发送一段 JSON 数据:
{"access_token":"ACCESS_TOKEN","token_type":"bearer","expires_in":2592000,"refresh_token":"REFRESH_TOKEN","scope":"read","uid":100101,"info":{...}}2. 简化模式简化模式(implicit grant type),有些 Web 应用只有前端,没有后端,这时就只能将令牌储存在前端浏览器中 。所以在RFC 6749中还规定了第二种授权方式,允许直接向前端颁发令牌,因为是直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,所以称为 "隐藏(授权码)式implicit",或者被称为隐式授权模式 。
隐式授权模式的客户端一般是指用户浏览器,访问令牌通过重定向的方式传递到用户浏览器中,再通过浏览器的JavaScript代码来获取访问令牌 。这种授权方式的所有步骤都是在浏览器中完成,没有通过第三方应用程序的服务器,访问令牌直接暴露在浏览器端,令牌对访问者是可见的,且客户端不需要认证,所以可能会导致访问令牌被黑客获取 。该模式适用于对安全性要求不高的应用中,仅适用于需要临时访问的场景 。
一文搞懂OAuth2.0授权协议是怎么回事

文章插图
 
流程步骤:


推荐阅读