石墨文档后台接收到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后,根据后台用户账号的绑定关系,确认当前登录用户登录
ImplicitImplicit翻译是隐藏式,这种针对纯web前端应用,没有后台,就没办法像上面一样了,令牌只能放在前端。这种也叫client side,又称为User Agent Flow,先说具体用法。
client直接请求authorization server获取access_token. 请求参数是client id和redirect url, 最后认证返回后拼接#access_code. 类似下图。
由于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是通过#传递的。这里涉及一个叫中间人攻击的安全问题,见。
注意,令牌access_token的位置是 URL 锚点(fragment),而不是查询字符串(querystring),这是因为 OAuth 2.0 允许跳转网址是 HTTP 协议,因此存在"中间人攻击"的风险,而浏览器跳转时,锚点不会发到服务器,就减少了泄漏令牌的风险
qq提示
可通过js方法:window.location.hash来获取URL中#后的参数值。
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