oauth password模式_史上最干的Oauth案例分析
一、什么是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这个接口实现后续逻辑。我猜测后续的事情有如下几步:
- 根据client_id、client_secret、grant_type、code、redirect_uri、fmt调用腾讯qq提供的获取token 接口 PC网站:https://graph.qq.com/oauth2.0/token
- 根据授权范围,获取qq账户的头像、qq号码等信息
- 基于腾讯qq的相关信息绑定用户信息,比如用qq号码、头像等信息绑定用户用手机注册的知乎账号,这就是为什么有些应用使用第三方登录之后还需要进行手机认证!!!
- 跳转到知乎主页
- 保持两篇文章中夹杂一个广告
至此,知乎通过第三方qq登录案例分析完毕
附上腾讯qq 第三方登录开发手册 :
QQ互联WIKIwiki.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.绑定别人的银行卡 2.绑定已绑定的银行卡 3.绑定支持的银行卡 4.绑定不支持的银行卡 5.绑定信用卡 6.绑定过期的银行卡 7.绑定外地的银行卡 ...
- 软件史上比较严重的bug案例
分享几个软件史上比较严重的bug案例... 堪称CS史上最严重错误,至少造成10亿美金损失: "我把 Null 引用称为自己的十亿美元错误.它的发明是在1965 年,那时我用一个面向对象语言 ...
- java spring框架 注解_史上最全的java spring注解
史上最全的java spring注解,没有之一 注解是个好东西,但好东西我们也是看见过,整理过,理解过,用过才知道好.不求我们每个都记住,但求保有印象,在需要的时候能提取出来再查找相关资料,平时工作就 ...
- @async注解_史上最全的java spring注解
史上最全的java spring注解,没有之一 注解是个好东西,但好东西我们也是看见过,整理过,理解过,用过才知道好.不求我们每个都记住,但求保有印象,在需要的时候能提取出来再查找相关资料,平时工作就 ...
- oauth password模式_SpringBoot OAuth2.0 认证授权(密码模式)
SpringBoot 整合 SpringSecurity,token 落地,前后端分离接口安全. SpringBoot 环境搭建和入门:Spring Boot 2.x 快速入门 导入 mysql 脚本 ...
- python迭代器与生成器答案_史上最全 Python 迭代器与生成器
原标题:史上最全 Python 迭代器与生成器 作者:浪子燕青 链接:http://www.langzi.fun/迭代器与生成器.html 迭代器与可迭代对象 概念 迭代器:是访问数据集合内元素的一种 ...
- idea mac 替换_史上最全的IntelliJ IDEA For Mac快捷键!快来收藏吧!
原标题:史上最全的IntelliJ IDEA For Mac快捷键!快来收藏吧! IntelliJ IDEA 2020 for Mac适用于JVM的功能强大且符合人体工程学的IDA! IDEA对新手来 ...
- vscode win10笔记本 蓝屏_史上最详细的win10蓝屏错误代码大全详解
[文章导读] 蓝屏是操作系统为了保护硬件而产生的蓝屏,但蓝屏代码有上百种,有些网友对于蓝屏代码比较头疼,下面小编给大家分享史上最全的蓝屏代码大全. 蓝屏是操作系统为了保护硬件而产生的蓝屏,但蓝屏代码有 ...
- seat TCC 实战(图解_秒懂_史上最全)
文章很长,而且持续更新,建议收藏起来,慢慢读! Java 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 免费赠送 经典图书 : 极致经典 + 社群大片好评 < Java 高 ...
最新文章
- Vue+Flask看这篇就够了
- 机器学习中样本不平衡处理办法
- 《PHP求职宝典》--Web设计页面笔记
- How to find documentation of given API
- 人生应该记住的16句话
- 机器学习笔记(二十)——求解最大熵模型
- mha数据备份_MySQL备份与恢复之保证数据一致性(5)
- 刷爆推特的钢管舞机器人有~故~事
- 20191126_2_英文情感分析
- 两转变两服务器,两大服变鬼两老服制霸,《魔兽世界》怀旧免转结束后的服务器调查...
- 15条经典实用的网站优化技巧
- 怎样对流媒体进行压力测试_loadrunner流媒体压力测试
- 小米路由器4C刷机(以OpenWrt为例)
- 阿里云ECS服务器退订
- js 判断是企业微信或微信
- Unity漫延的实现思路(流体漫延, 火烧草地的漫延等)
- Z05 - 004、网站流量多维度细分(流量分析)
- ESP32入门基础之UDP和TCP实验
- Java之List系列--ArrayList扩容的原理
- 2019总结,2020寄望(没有干货,纯属闲聊)
热门文章
- JAVA编译异常处理:java.lang.OutOfMemoryError: PermGen space
- ssh 免密码登录(设置后仍需输密码的原因及解决方法)
- 如何折叠Visual Studio Code for Windows中的代码部分?
- 大数据与 AI 生态中的开源技术总结
- PHP 7.3声称速度比PHP 5快3倍还多,值得更新了!
- idea中的pom文件中的jar包下载不了,手动下载jar包的方法
- aria2下载工具命令行和图形化界面使用
- JS获取上传文件的大小
- POJ - 2549 Sumsets
- IQueryable和IQueryProvider初尝