一、什么是Oauth2

OAuth 2.0是目前最流行的授权机制,用来授权第三方应用,获取用户数据,访问用户资源。

1.授权码模式的第三方登录架构

  • client:第三方应用。eg:使用qq 或者微信 1.登录web端的processon 2.登录知乎 3.登录百度网盘等
  • Resource owner : 资源拥有者。即qq和微信账号的拥有者,拥有的资源如:qq 号、qq密码、昵称、头像、身份证号等个人信息
  • Authorization server :授权服务器。深圳南山必胜客---腾讯授权中心服务器
  • Resource server :资源服务器。 深圳南山必胜客---腾讯用户信息存储服务器

在步骤1中,发起第三方登录的URL需要用到如下参数:

  • response_type:表示授权类型,必选项,此处的值固定为"code"
  • client_id:表示客户端的ID,必选项
  • redirect_uri:表示重定向URI,可选项
  • scope:表示申请的权限范围,可选项
  • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值

在步骤4中,授权服务器会返回URI如下参数:

  • code:表示授权码,必选项。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。
  • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。

在步骤5中,客户端获取授权令牌的URL中有如下参数:

  • grant_type:表示使用的授权模式,必选项,此处的值固定为"authorization_code"。
  • code:表示上一步获得的授权码,必选项。
  • redirect_uri:表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致。
  • client_id:表示客户端ID,必选项。

在步骤6中,授权服务器返回的URL中有如下参数
access_token:表示访问令牌,必选项。

  • token_type:表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。
  • expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
  • refresh_token:表示更新令牌,用来获取下一次的访问令牌,可选项。
  • scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。

2.知乎登录案例

登录传说的网站

知乎 - 有问题,上知乎​www.zhihu.com

点击QQ登录之后,页面会跳转至南山必胜客的授权服务器所提供的授权页面

此时的浏览器导航栏地址为:

https://graph.qq.com/oauth2.0/show?which=Login&display=pc&scope=get_user_info%2Cget_info%2Cadd_t%2Cadd_pic_t%2Cget_other_info%2Cget_fanslist%2Cget_idollist%2Cadd_idol%2Cadd_share&state=364541355664566b6e354273746444574c6e4c766d314470506449466139754c&redirect_uri=https%3A%2F%2Fwww.zhihu.com%2Foauth%2Fcallback%2Fqqconn%3Faction%3Dlogin%26from%3D&response_type=code&client_id=100490701

我们仔细品品这个地址

path:https://graph.qq.com/oauth2.0/show                    很明显TX也使用oauth2 协议进行授权
which=Login/error   当前处于登录界面/错误界面
display=pc                终端类型
scope=get_user_info,get_info,add_t,add_pic_t,get_other_info,get_fanslist,get_idollist,add_idol,add_share                          授权范围
state=364541355664566b6e354273746444574c6e4c766d314470506449466139754c         状态吗
redirect_uri=https://www.zhihu.com/oauth/callback/qqconn?action=login&from=                       重定向路径,TX 返回授权码之后需要进行地址跳转,此参数为跳转到知乎的某个页面
response_type=code                  采用授权码授权
client_id=100490701                   知乎给腾讯的客户端id

关于client_id,因为腾讯需要知道第三方应用的安全性等内容,所以第三方应用在使用腾讯登录时,需要先向腾讯qq申请,从而获取client_id和client_secret

腾讯的授权管理界面:

QQ互联官网首页​connect.qq.com

创建应用之后会获取client_id和client_secret

点击授权之后

只要手速快,就能截取到地址栏的数据

https://www.zhihu.com/oauth/callback/qqconn?action=login&from=&code=E82625C6CB0D3938EAE974D5822A93E2&state=364541355664566b6e354273746444574c6e4c766d314470506449466139754c

按照国际惯例,继续拆分该参数

path=https://www.zhihu.com/oauth/callback/qqconn     上次知乎给腾讯授权服务器发送的重定向路径,腾讯分发授权码成功后会指示浏览器跳转到该路径
action=login   上一步传递的redirect_uri 里面的参数
from=              上一步传递的redirect_uri 里面的参数
code=E82625C6CB0D3938EAE974D5822A93E2   这就是传说中的授权码
state=364541355664566b6e354273746444574c6e4c766d314470506449466139754c    状态码

ok!我们终于拿到授权码code=E82625C6CB0D3938EAE974D5822A93E2

之后的事情就和qq账号拥有者的我没有关系了

知乎后端会通过https://www.zhihu.com/oauth/callback/qqconn这个接口实现后续逻辑。我猜测后续的事情有如下几步:

  1. 根据client_id、client_secret、grant_type、code、redirect_uri、fmt调用腾讯qq提供的获取token 接口 PC网站:https://graph.qq.com/oauth2.0/token
  2. 根据授权范围,获取qq账户的头像、qq号码等信息
  3. 基于腾讯qq的相关信息绑定用户信息,比如用qq号码、头像等信息绑定用户用手机注册的知乎账号,这就是为什么有些应用使用第三方登录之后还需要进行手机认证!!!
  4. 跳转到知乎主页
  5. 保持两篇文章中夹杂一个广告

至此,知乎通过第三方qq登录案例分析完毕

附上腾讯qq 第三方登录开发手册 :

QQ互联WIKI​wiki.connect.qq.com

二、Oauth2的四种模式

1.授权码模式

略,上面讲过

2.简化模式/隐式模式(implicit grant type)

这种方式是授权码模式的一个简化版本,资源所有者授权后,授权服务器直接将令牌发放至代理终端(例如浏览器),省去了授权码的流程。这种方式一般用于没有服务器的单页面应用,因为他们没有服务器端去拿授权码换取 Token。

步骤1中发起请求所携带的参数:

  • response_type:表示授权类型,此处的值固定为"token",必选项。
  • client_id:表示客户端的ID,必选项。
  • redirect_uri:表示重定向的URI,可选项。
  • scope:表示权限范围,可选项。
  • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值

步骤5中返回的URL参数

  • access_token:表示访问令牌,必选项。
  • token_type:表示令牌类型,该值大小写不敏感,必选项。
  • expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
  • scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。
  • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数

3.密码模式

密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"服务商提供商"索要授权。

在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品,或者企业内部的应用,应用之间是完全可信的,都是第一方应用。。而认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。

步骤2向授权服务器发送的URL中包含一下参数:

  • grant_type:表示授权类型,此处的值固定为"password",必选项。
  • username:表示用户名,必选项。
  • password:表示用户的密码,必选项。
  • scope:表示权限范围,可选项。

️‍♂️注意:此时是不需要传递客户端的client_id ,企业内部应用都是第一方应用

4.客户端模式

客户端模式其实不属于oauth授权范围,用户想客户端注册,客户端以自己的名义去申请资源,整个过程和用户无关

三、token令牌更新

如果用户访问的时候,客户端的"访问令牌"已经过期,则需要使用"更新令牌"申请一个新的访问令牌。

客户端发出更新令牌的HTTP请求,包含以下参数:

  • granttype:表示使用的授权模式,此处的值固定为"refreshtoken",必选项。
  • refresh_token:表示早前收到的更新令牌,必选项。
  • scope:表示申请的授权范围,不可以超出上一次申请的范围,如果省略该参数,则表示与上一次一致。

令牌的有效期到了,如果让用户重新走一遍上面的流程,再申请一个新的令牌,很可能体验不好,而且也没有必要。OAuth 2.0 允许用户自动更新令牌。

具体方法是,B 网站颁发令牌的时候,一次性颁发两个令牌,一个用于获取数据,另一个用于获取新的令牌(refresh token 字段)。令牌到期前,用户使用 refresh token 发一个请求,去更新令牌。

https://b.com/oauth/token? grant_type=refresh_token& client_id=CLIENT_ID& client_secret=CLIENT_SECRET& refresh_token=REFRESH_TOKEN

上面 URL 中,

grant_type

参数为

refresh_token

表示要求更新令牌,

client_id

参数和

client_secret

参数用于确认身份,

refresh_token

参数就是用于更新令牌的令牌。

B 网站验证通过以后,就会颁发新的令牌。

oauth password模式_史上最干的Oauth案例分析相关推荐

  1. 史上最全提现模块案例分解

    史上最全提现模块案例分解 ----绑定银行卡: 1.绑定别人的银行卡 2.绑定已绑定的银行卡 3.绑定支持的银行卡 4.绑定不支持的银行卡 5.绑定信用卡 6.绑定过期的银行卡 7.绑定外地的银行卡 ...

  2. 软件史上比较严重的bug案例

    分享几个软件史上比较严重的bug案例... 堪称CS史上最严重错误,至少造成10亿美金损失: "我把 Null 引用称为自己的十亿美元错误.它的发明是在1965 年,那时我用一个面向对象语言 ...

  3. java spring框架 注解_史上最全的java spring注解

    史上最全的java spring注解,没有之一 注解是个好东西,但好东西我们也是看见过,整理过,理解过,用过才知道好.不求我们每个都记住,但求保有印象,在需要的时候能提取出来再查找相关资料,平时工作就 ...

  4. @async注解_史上最全的java spring注解

    史上最全的java spring注解,没有之一 注解是个好东西,但好东西我们也是看见过,整理过,理解过,用过才知道好.不求我们每个都记住,但求保有印象,在需要的时候能提取出来再查找相关资料,平时工作就 ...

  5. oauth password模式_SpringBoot OAuth2.0 认证授权(密码模式)

    SpringBoot 整合 SpringSecurity,token 落地,前后端分离接口安全. SpringBoot 环境搭建和入门:Spring Boot 2.x 快速入门 导入 mysql 脚本 ...

  6. python迭代器与生成器答案_史上最全 Python 迭代器与生成器

    原标题:史上最全 Python 迭代器与生成器 作者:浪子燕青 链接:http://www.langzi.fun/迭代器与生成器.html 迭代器与可迭代对象 概念 迭代器:是访问数据集合内元素的一种 ...

  7. idea mac 替换_史上最全的IntelliJ IDEA For Mac快捷键!快来收藏吧!

    原标题:史上最全的IntelliJ IDEA For Mac快捷键!快来收藏吧! IntelliJ IDEA 2020 for Mac适用于JVM的功能强大且符合人体工程学的IDA! IDEA对新手来 ...

  8. vscode win10笔记本 蓝屏_史上最详细的win10蓝屏错误代码大全详解

    [文章导读] 蓝屏是操作系统为了保护硬件而产生的蓝屏,但蓝屏代码有上百种,有些网友对于蓝屏代码比较头疼,下面小编给大家分享史上最全的蓝屏代码大全. 蓝屏是操作系统为了保护硬件而产生的蓝屏,但蓝屏代码有 ...

  9. seat TCC 实战(图解_秒懂_史上最全)

    文章很长,而且持续更新,建议收藏起来,慢慢读! Java 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 免费赠送 经典图书 : 极致经典 + 社群大片好评 < Java 高 ...

最新文章

  1. Vue+Flask看这篇就够了
  2. 机器学习中样本不平衡处理办法
  3. 《PHP求职宝典》--Web设计页面笔记
  4. How to find documentation of given API
  5. 人生应该记住的16句话
  6. 机器学习笔记(二十)——求解最大熵模型
  7. mha数据备份_MySQL备份与恢复之保证数据一致性(5)
  8. 刷爆推特的钢管舞机器人有~故~事
  9. 20191126_2_英文情感分析
  10. 两转变两服务器,两大服变鬼两老服制霸,《魔兽世界》怀旧免转结束后的服务器调查...
  11. 15条经典实用的网站优化技巧
  12. 怎样对流媒体进行压力测试_loadrunner流媒体压力测试
  13. 小米路由器4C刷机(以OpenWrt为例)
  14. 阿里云ECS服务器退订
  15. js 判断是企业微信或微信
  16. Unity漫延的实现思路(流体漫延, 火烧草地的漫延等)
  17. Z05 - 004、网站流量多维度细分(流量分析)
  18. ESP32入门基础之UDP和TCP实验
  19. Java之List系列--ArrayList扩容的原理
  20. 2019总结,2020寄望(没有干货,纯属闲聊)

热门文章

  1. JAVA编译异常处理:java.lang.OutOfMemoryError: PermGen space
  2. ssh 免密码登录(设置后仍需输密码的原因及解决方法)
  3. 如何折叠Visual Studio Code for Windows中的代码部分?
  4. 大数据与 AI 生态中的开源技术总结
  5. PHP 7.3声称速度比PHP 5快3倍还多,值得更新了!
  6. idea中的pom文件中的jar包下载不了,手动下载jar包的方法
  7. aria2下载工具命令行和图形化界面使用
  8. JS获取上传文件的大小
  9. POJ - 2549 Sumsets
  10. IQueryable和IQueryProvider初尝