OAuth 流程与发展总结 (1.0 => 1.0a => 2.0)
OAuth 流程与发展 (1.0 => 1.0a => 2.0)
概述
- 概述: 开放授权协议
- 作用: 允许第三方应用访问服务提供方中注册的终端用户的部分资源
下面是官方描述: [OAuth描述] The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. 参与者:
- Client (Consumer) => 第三方应用
- Resource Owner(User) => 用户
- Resource Server(Service Provider) => 资源服务提供方(OAuth2.0将服务提供方拆分为两部分)
- Authorization Server(Service Provider) => 授权服务提供方(OAuth2.0将服务提供方拆分为两部分)
- OpenID (WHO) 和 OAuth (WHAT)
=> OpenID 更加关注 '我是谁' 的问题
=> OAuth 更加关注 '我能获得哪些权限的问题'
OAuth1.0 流程图
接口
- (步骤 A) Consumer申请Request Token(/oauth/1.0/request_token):
oauth_consumer_key
oauth_signature_method
oauth_signature
oauth_timestamp
oauth_nonce
oauth_version - (步骤 B) Service Provider返回Request Token:
oauth_token
oauth_token_secret - (步骤 C) Consumer重定向User到Service Provider(/oauth/1.0/authorize):
oauth_token
oauth_callback - (步骤 D) Service Provider在用户授权后重定向User到Consumer:
oauth_token - (步骤 E) Consumer申请Access Token(/oauth/1.0/access_token):
oauth_consumer_key
oauth_token
oauth_signature_method
oauth_signature
oauth_timestamp
oauth_nonceoauth_version - (步骤 F) Service Provider返回Access Token:
oauth_token
oauth_token_secret
OAuth1.0 漏洞
两种Token,分别是Request Token和Access Token,其中Request Token又涉及两种状态,分别是未授权和已授权。
攻击者会先申请攻击者自己的Request Token,然后诱使用户授权这个攻击者的Request Token,接着针对回调地址的使用,又存在以下几种攻击手段:
- 如果Service Provider没有限制回调地址(应用设置没有限定根域名一致),那么攻击者可以把oauth_callback设置成成自己的URL。
- 如果Consumer不使用回调地址(桌面或手机程序),而是通过User手动拷贝粘贴Request Token完成授权的话,那么只要攻击者在在User前面发起请求,就能拿到User的Access Token。
OAuth1.0 改进
- 步骤 B 传递 callback_url参数 (而不是 获取已授权 request_token 步骤) Consumer申请Request Token时,必须传递oauth_callback, 让callback参与签名, 避免攻击者假冒callback。
- 验证完未授权 request_token 返回新的参数 oauth_verifier 验证完成后会返回验证码(oauth_verifier)在没有callback的时候, 服务提供方显示给用户,然后用户可以在第三方应用的设备上输入,标示自己已经授权(和未授权的用户分开),然后第三方应用必须加上该验证码去获取
OAuth1.0a 流程图
OAuth2.0 流程
OAuth 2.0定义了四种授权方式。
- 授权码模式(authorization code)(本文只讲解该授权方式)
- 简化模式(implicit)
- 密码模式(resource owner password credentials)
- 客户端模式(client credentials)
接口
- (步骤 A) Client 向Authorization Server发出申请(/oauth/2.0/authorize):
response_type = code client_id redirect_uri scope state - (步骤 B) Authorization Server 在Resource Owner授权后给Client返回
code state - (步骤 C) Client向Authorization Server发出申请(/oauth/2.0/token):
grant_type = authorization_code code client_id client_secrect redirect_uri - (步骤 E) Server在Resource Owner授权后给Client返回Access Token:
access_token token_type expires_in refresh_token
关于 state 参数
[RFC 对state参数的解释]
The authorization server SHOULD require the client to provide the complete redirection URI (the client MAY use the "state" request parameter to achieve per-request customization). If requiring the registration of the complete redirection URI is not possible, the authorization server SHOULD require the registration of the URIscheme, authority, and path (allowing the client to dynamically vary only the query component of the redirection URI when requesting authorization).
我们假设出现下面的场景:
(1)用户甲到第三方网站A登录后,到了绑定页面。此时还没绑定微博。
(2)绑定页面提供一个按钮:“绑定微博”(地址a:http://aaa.com/index.php?m=us...)
(3)用户甲点击地址a,程序生成如下地址b:
https://api.weibo.com/oauth2/...【9999999】&redirect_uri=【http://aaa.comindex.php】&response_type=【code】
(4)用户甲浏览器定向到地址b,授权该应用。
(5)授权服务器根据传递的redirect_uri参数,组合认证参数code生成地址c:
http://aaa.comindex.php&code=【809ui0asduve】
(6)用户甲浏览器返回到地址c,完成绑定
此时即使我们交换两个用户的地址c,则会出现绑定错误的情况,避免出现该情况的办法就是对state参数进行验证,来判断该state参数是否是该用户所对应的重定向地址
参考文献
- https://huoding.com/2010/10/10/8 《OAuth那些事儿》
- https://huoding.com/2011/11/0... 《OAuth的改变》
- https://www.zhihu.com/questio...《Oauth 1.0 1.0a 和 2.0 的之间的区别有哪些?》
- http://www.ruanyifeng.com/blo... 《理解 OAuth2.0》
- http://blog.sina.com.cn/s/blo... 《小议OAuth 2.0的state参数——从开发角度也说《互联网最大规模帐号劫持漏洞即将引爆》》
- https://tools.ietf.org/html/r... 《RFC 6749》
结语
这篇文章是参考网上的资料的总结, 如果有错误欢迎批评指正, 如果侵权, 请作者联系我删除文章, 谢谢
有兴趣的同学也可以参照 [微博OAuth] API, 申请一个第三方应用, 参照微博API去实现一个获取 access_token的测试用例 (微博会给予申请的第三方应用 client_id, client_secret)
OAuth 流程与发展总结 (1.0 => 1.0a => 2.0)的更多相关文章
- 浅谈Http1.0/Http1.1/Http2.0/Https
HTTP 1.0 → HTTP 1.1 长连接 HTTP 1.1默认支持长连接,减少了TCP连接次数,节约开销. HTTP 1.0所保持的TCP每次只能处理一个请求,最典型的就是pipline管线化模 ...
- ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借
ASP.NET MVC深入浅出系列(持续更新) 一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...
- C# HTTP1.0 1.1 2.0与HTTPS 、TCP/IP协议的UDP与TCP、 Socket介绍与WebSocket
一.HTTP1.0 1.1 2.0和HTTPS 1.HTTP协议是什么? HTTP协议是超文本传输协议的缩写,英文是Hyper Text Transfer Protocol.它是从WEB服务器传输超文 ...
- Swift 3.0 【Swift 3.0 相较于 Swift 2.2 的变化】
一.编译器和语法变化 函数或方法参数 调用函数或方法时从第一个参数开始就必须指定参数名 在Swift的历史版本中出现过在调用函数时不需要指定任何函数参数(或者从第二个参数开始指定参数名),在调用方法时 ...
- .NET Framework3.0/3.5/4.0/4.5新增功能摘要
Microsoft .NET Framework 3.0 .NET Framework 3.0 中增加了不少新功能,例如: Windows Workflow Foundation (WF) Windo ...
- atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性
atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性 1.1. Servlet和JSP规范版本对应关系:1 1.2. Servlet2 ...
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三)
前两章我为大家详细介绍了如何搭建Maven环境.Spring MVC的流程结构.Spring MVC与Struts2的区别以及示例中的一些配置文件的分析.在这一章,我就对示例的层次结构进行说明,以及M ...
- 让人眼花缭乱的 RSS 版本0.90、0.91、0.92、0.93、0.94、1.0 和 2.0
1.0的规范 http://web.resource.org/rss/1.0/spec 2.0的规范 http://cyber.law.harvard.edu/rss/rss.html 一个介绍什么是 ...
- HTTP协议以及HTTP2.0/1.1/1.0区别
HTTP协议以及HTTP2.0/1.1/1.0区别 一.简介 摘自百度百科: 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所 ...
随机推荐
- layui 触发 select 下option 被选择事件
1.找到值为某一个的元素 var S0 = 'dd[lay-value='+ level+']'; 2.给该元素注册点击事件 siblings(兄弟节点) $('select[name=\'leve ...
- SG函数学习
尼姆博弈就是sg函数的简单体现 学习粗:https://blog.csdn.net/luomingjun12315/article/details/45555495 //f[N]:可改变当前状态的方式 ...
- 《走出软件作坊》//TODO
目录 简介 结束语 简介 作者吕建伟(@阿朱),研发管理专家,原京东技术学院院长,中国互联网技术联盟发起人,历任首席架构师.技术总监以及CTO等职位.目前已接受用友集团董事长王文京邀请,加入用友组建研 ...
- Momentum(动量)方法的python实现
Momentum方法可以说是对SGD的进一步优化,细节可以参考这里 这里用python对其进行简单实现,如下: # coding=utf-8 """ 基于小批量梯度下降来 ...
- elasticsearch ik中文分词器的使用详解
(基于es5.4)先喵几眼github,按照步骤安装好分词器 link:https://github.com/medcl/elasticsearch-analysis-ik 复习一下常用的操作 .查看 ...
- 浏览器加载、渲染html的顺序和页面优化
浏览器加载和渲染html的顺序 1. IE下载的顺序是从上到下,渲染(就是把请求的内容显示到浏览器屏幕上)的顺序也是从上到下,下载和渲染是同时进行的. 2. 在渲染到页面的某一部分时,其上面的所有部分 ...
- OpenCV 为程序界面添加滑动条
#include <cv.h> #include <highgui.h> using namespace cv; /// 全局变量的声明与初始化 ; int alpha_sli ...
- 以elasticsearch-hadoop 向elasticsearch 导数,丢失数据的问题排查
实际这是很久之前的问题了,当时没时间记录 这里简单回顾 项目基于 数据架构不方便说太细,最精简的 somedata-> [kafka]->spark-stream->elastics ...
- AndroidP推出多项AI功能,会不会引发新的隐私担忧?
让谷歌很"伤心"的是,相比苹果iOS系统的统一,Android系统的碎片化态势实在太严重了.就像已经发布一年多的Android O,其占有率仅有4.6%.主要是因为很多手机厂商都会 ...
- springboot学习笔记:6.内置tomcat启动和外部tomcat部署总结
springboot的web项目的启动主要分为: 一.使用内置tomcat启动 启动方式: 1.IDEA中main函数启动 2.mvn springboot-run 命令 3.java -jar XX ...