前文简单介绍了OAuth2.0,详情见:简单认识OAuth2.0
今天看一看授权方式,一共有四种,分别为:授权码、隐式授权,密码方式和客户端凭证。现在使用最多的也是最安全的就是授权码方式,以下分别简单介绍下:
授权码方式(authorization code)
授权码方式是最完整,流程最严密的授权方式,第三方应用先申请一个授权码(authorization code),然后再用该码获取令牌(Token)。
它适用于那些有后端的 Web 应用,基于浏览器的重定向把用户导向第三方应用的软件页面。分为两个步骤,第一步通过web获取认证服务器的授权码,第二步通过使用第一步的授权码请求Token,这时候是在服务器后台进行的,用户是看不到的,因此这种方式是比较安全的。
一个例子,第一步发送获取授权码的请求
其中的请求参数有些是必须的并且是固定的
- response_type (必须),值为code
- client_id (必须),每个应用的标记,让授权服务器知道是谁
- redirect_uri(可选)重定向的地址
- scope(可选)范围,比如读,写,服务器自己定义的字符串列表
- state(可选,建议添加),客户端添加的用于保持一些状态等,授权服务会原装返回
获取授权码的请求发送后,授权服务器验证后,会把code=AUTHORIZATION_CODE&state=xzy返回给客户端。
第二步获取Token
用获取的授权码获取Token时需要的参数
请求被执行后,返回一个包含token的json数据,其中是access_token就是令牌信息,refresh_token则是刷新令牌时用到的令牌,避免重复以上2个步骤。
到此验证就完了,以后访问服务器就需要带着这个Token了,
简化版方式(隐式授权implicit)
在没有后端的应用中,允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤,所以称为隐式授权。
请求和授权码一样,只是response_type为token,授权服务器接收请求后,直接返回token,例如xxxxx#access_token=2YotnFZFEjr1zCsicMWpAA&state=xyz&token_type=example&expires_in=3600
密码式(password)
把资源所有者用户名和密码作为获取访问令牌的授权许可,这种方式显然风险很大,因此只适用于其他授权方式都无法采用的情况,而且必须是用户高度信任的应应用。
一个简单请求的例子:
其中grant_type为password,username和password是资源所有者的用户名密码。
客户端凭证(client)
第三方应用以自己的名义,而不是以用户的名义向授权服务器索取认证,适用于没有前端的命令行应用,即在命令行下请求令牌。
这种请求的grant_type为client_credentials,只用这么一个参数是必须的。