OAuth2.0理解和用法 (2)

直接看上面的图,看到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则是代表用户本人,注意区别。

OAuth2.0理解和用法

1.微信用户通过浏览器访问了石墨文档,然后登陆页,然后点了微信登录按钮
这时候,浏览器请求石墨微信登录回调地址,石墨后台返回302,response附属location. 浏览器重定向跳转到微信二维码认证页面。

OAuth2.0理解和用法

https://open.weixin.qq.com/connect/qrconnect?appid=wx5a67899f4af8b0b1&redirect_uri=https%3A%2F%2Fshimo.im%2Flizard-api%2Fauth%2Fwechat%2Flogin_callback&response_type=code&scope=snsapi_login&state=740a608f-23b4-4abd-b941-e13d2b5c0dbe#wechat_redirect

注意几个参数:

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,浏览器重定向到石墨后台

https://shimo.im/lizard-api/auth/wechat/login_callback?code=081r8QFa1aYaRA03J7Ha1gUXl42r8QFk&state=740a608f-23b4-4abd-b941-e13d2b5c0dbe

这个回调地址code就是微信开放平台(authorization server)颁发给石墨文档(client)的code。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwxjs.html