刚教完面试官OAuth 2.0为什么要先获取受权码code
文章收录在我的 GitHub 仓库,欢迎Star/fork:
Java-Interview-Tutorial
Wasabi1234/Java-Interview-Tutorial
xx软件最终是通过访问令牌请求到我的公众号里的文章。访问令牌是通过受权码换来的。你有想过为何要用受权码换令牌,而不直接颁发访问令牌呢?
OAuth 2.0 的角色
资源拥有者、用户端(即第三方软件)、受权服务和受保护资源。
- 资源拥有者=> 我
- 用户端 => xx软件
- 受权服务 -> 公众号开放平台的受权服务
- 受保护资源 -> 我的公众号里的文章
image
肯定要受权码吗?
第 4 步受权服务生成受权码,倘若我们不要受权码,这步直接返回访问令牌access_token
。那就不能重定向,由于这样会把安全保密性要求极高的访问令牌暴露在浏览器,添加访问令牌失窃风险。这显然不行的呀!即若无受权码,就只能把访问令牌发给第三方软件的后台服务:
image
看着如同没问题?我访问xx软件,xx软件说要排版文章我得给它受权,不然vx公众号不干,而后xx软件就引导我跳转到了公众号的受权服务。到受权服务之后,开放平台验证xx的合法性及我的登录状态后,生成受权页面。我赶紧扫码同意受权,于是开放平台知道可以把我的文章数据给xx软件。
于是,开放平台生成访问令牌 access_token
,并且通过后台服务方式返回给xx软件。xx就能正常工作。
但是当我被浏览器重定向到受权服务,我和xx间的连接就断了,相当于此时我和受权服务建立连接后,将一直“停留在受权服务页面”。我再也没有重连到xx。
但这时xx已拿到我受权后的访问令牌,也使用访问令牌获取了我的号里的文章数据。这时,考虑我的感受。xx应该要通知到我,但是如何做呢?现在连接可是断了的呀!
为了让xx通知到我,我必需跟xx重建 “连接”。即第二次重定向,我受权后,又重新重定向回到xx的地址,这样我就跟xx有了新连接。
为重建连接,又不能暴露访问令牌,就有这样的临时、间接凭证:受权码。由于xx最终要拿到高安全要求的访问令牌,并非受权码,受权码可以暴露在浏览器。
有了受权码,访问令牌可以在后台服务间传输,同时还可重建我&xx间的连接。
所以,通过受权码,既考虑了我的客户体验,又考虑了通信安全。
执行受权码流程时,受权码和访问令牌在xx和受权服务间究竟怎样流转的?
受权码许可类型的通信过程
间接通信
间接通信就是指获取受权码的交互。
image
我:“xx,我要访问你了。”
xx:“我把你引到受权服务,我需要受权服务给我一个受权码。”
受权服务:“xx,我把受权码发给浏览器了。”
小兔软件:“ 那我从浏览器拿到了受权码。”
xx和受权服务间,并无直接通信,而是通过中间人(浏览器).
直接通信
受权码换取访问令牌的交互,是“直接”的。
image
三方软件xx获取到受权码后,向受权服务发起获取访问令牌 access_token
的请求。
三方软件要代表资源拥有者去访问受保护资源
受权服务负责颁发访问令牌,受保护资源负责接收并验证访问令牌。
开发微信小程序场景
比方获取客户登录态信息的过程:
- 通过
wx.login(Object object)
获取登录凭证 code,该步是在小程序内部通过调用微信提供的 SDK 实现的 - 再通过该 code 换取客户的 session_key 等信息,即官方文档的
auth.code2Session
方法,同时该方法也是被强烈建议通过开发者的后台服务来调用
参考
- https://leokongwq.github.io/2017/02/28/why-oauth2-use-authorization-code.html
- https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html
- https://segmentfault.com/q/1010000014642301
- https://tools.ietf.org/html/rfc6749
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 刚教完面试官OAuth 2.0为什么要先获取受权码code