OAuth2.0理解和用法 (3)

石墨文档后台接收到code和state后,校验state是否有效,然后拿code和appId,appSecret去访问微信接口获取用户信息。这一步是在石墨文档后台进行的。浏览器看不到access_token. 而对于上一步生成的code,即便有人拿到code,应该已经失效了。code和state都是一次性的有效期。这样保证了access_token的安全性。

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code 返回: { "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE", "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" }

3.石墨文档获取到用户唯一id后,根据后台用户账号的绑定关系,确认当前登录用户登录

Implicit

Implicit翻译是隐藏式,这种针对纯web前端应用,没有后台,就没办法像上面一样了,令牌只能放在前端。这种也叫client side,又称为User Agent Flow,先说具体用法

client直接请求authorization server获取access_token. 请求参数是client id和redirect url, 最后认证返回后拼接#access_code. 类似下图。

OAuth2.0理解和用法

由于access_token网络传输,并不安全,很少使用这种方案。qq互联提供了一种,见 https://wiki.connect.qq.com/%e4%bd%bf%e7%94%a8implicit_grant%e6%96%b9%e5%bc%8f%e8%8e%b7%e5%8f%96access_token

1.请求认证的url参数: clientId, redirectUrI, Scope,state

client_id: 注册应用的 id,比如石墨文档在qq注册应用的appid

redirect_uri: 认证成功后要回调的地址,这个要和注册的时候一致

response_type: token

state: 同样的一次性随机数,会原样返回给client,防止csrf攻击。

2.认证成功后,回调地址中的access_token
qq认证成功后的示例:

?#access_token=FE04************************CCE2&expires_in=7776000&state=test

可以看到参数access_token是通过#传递的。这里涉及一个叫中间人攻击的安全问题,见。

注意,令牌access_token的位置是 URL 锚点(fragment),而不是查询字符串(querystring),这是因为 OAuth 2.0 允许跳转网址是 HTTP 协议,因此存在"中间人攻击"的风险,而浏览器跳转时,锚点不会发到服务器,就减少了泄漏令牌的风险

qq提示
可通过js方法:window.location.hash来获取URL中#后的参数值。

password

password需要用户把微信账号和密码给石墨文档,石墨拿着去微信换token,这种放弃看了,不可能给的,微信也不支持。

client

这种就是纯后台方案。client拿着client_id和secret去换access_token。通常就是我们后台服务调用的时候用到。比如使用aws的s3或者阿里云的oss上传文件。我们需要通过ak,sk认证,获取一个token,拿token去上传文件。这个流程写起来还挺麻烦的,一般都会封装好客户端给我们用。这里就不涉及用户了,只是客户端自己的认证了。

customize
自定义,我们也可以username + password登录走OAuth2.0校验。只是没client,或者说每个登录用户类似client。登录后返回access_token, 用户可以访问其他资源。

更新令牌

前面讲的4个授权方式,都是为了获取access_token。返回格式类似微信的:

{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE", "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" }

openid,unionid并不是必须的,这是微信认证用户的唯一的id。在微信的设计中,

access_token: 接口调用凭证,用来获取资源信息,比如用户的头像,昵称等。超时时间很短。微信设定为2h。

expire_in: access_token的超时时间,单位秒

refresh_token: 用户刷新access_token用的token。超时时间比较久。微信设定超时为30天,失效后需要用户重新授权。

https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN 返回 { "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" }

请求刷新token:

appid: client id,石墨注册在微信平台的id

grant_type: refresh_token固定

refresh_token: 上一步获取到的token

参考

官方: https://tools.ietf.org/html/rfc6749

微信登录功能文档: https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html

qq互联OAuth2.0文档: https://wiki.connect.qq.com/oauth2-0%e7%ae%80%e4%bb%8b

qq互联OAuth2.0 client-side user-agen-flow https://wiki.connect.qq.com/%e5%bc%80%e5%8f%91%e6%94%bb%e7%95%a5_client-side

微博OAth2.0文档: https://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6

github OAuth2.0文档: https://docs.github.com/cn/developers/apps/authorizing-oauth-apps

阮一峰:

github登录介绍: https://zhuanlan.zhihu.com/p/20913727

豆瓣登录流程图: https://www.cnblogs.com/wudimanong/p/10821215.html

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

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