直接看上面的图,看到B和C都特么叫Authorization Grant, 授权发放。一会儿用户给client发放,一会儿client又找authorization发放,这是要哪样。我当年就是看了无数次这个图没看懂。接着,一般的文章又会介绍OAuth2.0的4种授权方式,结合上图的授权,就会非常容易混淆,看不懂了。
官网描述授权发放:
An authorization grant is a credential representing the resource
owner's authorization (to access its protected resources) used by the
client to obtain an access token. This specification defines four
grant types -- authorization code, implicit, resource owner password
credentials, and client credentials -- as well as an extensibility
mechanism for defining additional types.
授权发放模式是指client获取access_token的方式。官方给了4种,
authorization code: 授权码
implicit: 隐藏式
resource owner password: 用户的账号密码方式
client: client的id认证方式
当然,也可以自由扩展,能认证返回access_token就行。
grant是指授权给client,4中授权模式对应的是上图的BCD,即获取access_token的过程有4种方式。
access token存储方式?
access token就是访问资源的凭证,令牌。它的安全很重要。为了防止泄露被窃取,通常是client后端服务用token获取资源,是存储在client后台服务的,比如redis,mysql中,和用户关联存储。在浏览器上是体现不出的。那中间人就不能网络拦截到token。即access_token不应该在浏览器访问网络中出现。
以下用石墨文档(client)采用微信(authorization server & resource server)登录的方案来描述理解4种授权方式。
Authorization Code授权码authorization code就不翻译了,代码里也是这么写的,翻译了就可能对不上了。这种方式获取token,首先用户让微信给一个code给client。client拿着code找微信换一个access_token,以后就用access_token获取用户的唯一id。
这个图对象比较多。先认识对象,微信用户(resource owner),浏览器,石墨文档(client),微信开放平台(authorization server),微信api(resource server)。
首先,石墨文档(client)需要在微信开放平台(authorization)注册,获取appId和appSecret. 这组凭证是石墨自己访问微信开放平台的。access_token则是代表用户本人,注意区别。
1.微信用户通过浏览器访问了石墨文档,然后登陆页,然后点了微信登录按钮
这时候,浏览器请求石墨微信登录回调地址,石墨后台返回302,response附属location. 浏览器重定向跳转到微信二维码认证页面。
注意几个参数:
appid: 石墨文档作为client在微信开发平台的凭证id
redirect_uri: 认证通过后,微信开放平台添加一个code参数到这个url后面,然后浏览器重定向到这个url。这个url是石墨文档后台接收code的接口。
response_type: code。固定
scope: 授权范围,想获取用户哪些资料的api。网页登录为snsapi_login
state: 这个是防刷的,防止csrf跨站请求伪造攻击。微信认证成功后,回调的时候会原样返回给石墨(client)。如果没这个,client接收参数就只有code,别人就是随意伪造碰撞code。而石墨生成了一次性token作为state,回调接口只有一次有效期。这里石墨用的uuid.
2.用户微信扫描二维码,通过认证
用户微信点击了确认,就代表了授权通过了,允许石墨获取access_token. 浏览器微信二维码页面收到code,拼接redirect的url,浏览器重定向到石墨后台
这个回调地址code就是微信开放平台(authorization server)颁发给石墨文档(client)的code。