oauth授权协议的原理
http://oauth.net/2/ 协议的原文。原来是1.0版本,现在是2.0版本了
https://ruby-china.org/topics/15396
https://blog.yorkxin.org/posts/2013/09/30/oauth2-1-introduction/
通俗解释:
http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
要解决的问题:
获取授权。每次登录,都要让用户进行授权。
现实中的例子,只有用户同意授权给妈妈网,腾讯才发放一个令牌给妈妈网,妈妈网凭借这个令牌去腾讯获取用户的信息。
那么就意味着说,令牌的生成规则要跟用户和妈妈网的信息绑定关系。
奇怪,如果这个令牌被泄漏呢?别人也可以凭借这个令牌拿到信息啊。现实生活中,别人即便拿到你的令牌(票券),的确是可以去通行。
但是现实生活中发现了这个漏洞后,会增加一些安排判断,比如车票,别人就算偷到,捡到车票也不能去乘车,还要比对一下是否与身份证号码匹配。
除非你拿到对方的身份证了。这样把安全系数提高。发生的概率就会减少。就算你拿到对方的身份证,有时候还会看看你本人样子是否与身份证照片相差很大。
在我们这一层,你在url中是可以看到key,没错。但是你得同时拿到密钥才行。需要密钥对数据进行签名的。签名失败是不允许访问的。
腾讯的微信是这样子:
1、用户授权后,则生成一个临时性的code返回给客户端
code如何生成的呢?参考了oauth2.0协议
该码与客户端ID和重定向URI,是一一对应关系。
客户端id。重定向的uri,是早就预定义好了。
请求腾讯去获取code的时候,会带两个关键性的参数:腾讯的appid(就是oauth2.0协议中的客户端id)、redirect_uri(腾讯要回跳回来的地址)
现在思考:为什么要验证redirect_uri是否与后台填写的域名一致呢。其实这样可以增加安全性。
我只会重定向到指定的url去。这样会更加安全。不会重定向到攻击者指定的url去。
qq登录的时候,还为了更加安全,做全路径判断了。以前只是同一个域名下即可了。后来为了安全。必须后台填写完全相同的url地址。
比如后台配置必须是这样的完整url: www.abc.com/qqlogin/callback.php
是域名www.abc.com是不行,以前是可以的。
那么会完全验证这个url是否一致。否则就拒绝掉。
这对于passport的参考意义:所有接入passport的子应用,我是不是可以限制回调地址呢?限制在指定域名下就可以。
目前来看,还不需要这样子做。没有遇到问题?
2、凭借appid和临时性的code去获取access_token
3、凭借access_token和用户的openid去获取用户的信息(昵称,头像等等)
通俗例子:
现在想要实现qq登录。
一种办法是:让用户把对方的帐号和密码发给a网站,让a网站去登录qq。那这样就不安全了,因为密码不能泄漏给这些网站。
把帐号和密码直接给a网站,a网站就能获取到qq的所有信息的权力了。这样子不安全。
现在明白原因了,为什么要设计一个用户的access_token,在每个网站不同。就是为了安全性。假设一个用户的access_token在a网站是一样的,在b网站也是一样的。
那么,泄漏了,就麻烦了。因为我可以获取用户的所有资料了。
这个access_token可以理解成令牌。
我在思考,我应该如何设计这种模式呢?
我可以画序列图,这样子清楚解释。
关键是这个access_token,这样子应用就不需要获取用户的密码了。完全通过这个授权层来实现登录。
我觉得code 与access_token是建立了一个映射关系的。
access_token则是与用户的openid建立了映射关系的。
access_token openid(根据appid和qq进行生成)
其实我在返回ticket的时候,完全可以增加一个字段expire,表示过期时间。这样子他们自己可以根据去刷新自己的cookie时长?
子应用和passport系统登录时间不一致,的确会导致一些用户体验不好。
靠近大家的习惯。oauth2.0这样的模式去。
获取临时性的code。然后凭借code获取ticket(类似于access_token)。
每次请求都必须要带上passport授予的key在url中。
思考:qq,微信这些实现oauth2.0登录的时候,为什么除了带上screct还要带上appid呢?
微信登录,只需要带上appid,就可以访问微信了。关于安全性,不过最终都要经过用户的授权:用户的微信帐号必须是登录状态。即便是登录状态,也要经过用户授权访问。
1、跳转到微信的授权登录页面去,不需要screct。因为这个需要用户授权才能操作。不涉及到安全性。之所以要传递一个appid在url中给微信,微信可以知道用户要登录哪个应用而已,方便做提醒"你正在准备登录妈妈网"
2、通过code去获取access_token,需要screct的原因是,这里涉及到安全性了。
为什么要设计一个refresh token?
怕access_token过期。
为什么要增加这个refresh token去延长access_token的有效期呢?
客户端:指的就是第三方应用程序。比如网站。
服务商:如何理解呢?通俗点理解呢。
资源所有者:指用户。这些资源是用户的,比如个人信息,保存的资料都是用户的。
state | 否 | 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验 |
这个state指是可以网站自己设置的参数,qq那边只是原封不动的返回来。据说这样可以避免csrf攻击。
不太理解。但是可以模仿。oauth官网文档是推荐填写这个的。既然是为了避免csrf攻击,伪造请求。
那么state的值就不要是一个固定的值了,因为可以伪造。所以要设置成一个动态变化的值。
比如可以:时间戳+随机数。时间戳是可以伪造的(用其他语言生成一个,时间只要同步就可以)。但是加上随机数。就很难确定是哪个随机数了。因为随机数每次都是变化的,对方就算模拟也很难模拟出恰好生成同一个随机数出来,它是在一个范围内变化的。
思考:为什么单独只需要在浏览器重定向(比如腾讯回跳到自己网站)的时候,附加上state返回呢?
其他通过access_token获取用户信息,这些都是服务器之间的通信。很难被截取到。
但是获取临时性code这一步,是在浏览器回跳的时候,别人也可以重定向这个地址,伪造请求。
现在要加上一个每次都变化的值会比较安全点。到底是如何攻击的呢?
passport倒未必需要这样子,我觉得passport调用方是自己的应用。不是外部应用。是自己公司的。是这样的吗?
我现在可以设置一个时间戳,然后缓存在session中。qq会返回过来。如果返回来的值不一样,则提示页面已过期。
这是网页版登录的正式文档:
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&lang=zh_CN
弄错了,结果跑到公众帐号平台去了:
http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html#.E7.AC.AC.E4.B8.80.E6.AD.A5.EF.BC.9A.E7.94.A8.E6.88.B7.E5.90.8C.E6.84.8F.E6.8E.88.E6.9D.83.EF.BC.8C.E8.8E.B7.E5.8F.96code
难怪提示,必须要使用客户端打开。
实际上过程是:二维码。扫描后就可以进行登录了。
我现在想理解一下,这个openid,unionid是根据什么生成的呢?
如何生成的呢?
同一个qq号,每个应用id对应的openid会不同。
容易把人给搞晕:access_token
openid之类的。
根据access_token才能访问。access_token存在有效期。附加上access_token和openid才能拿到指定用户的信息。
目前腾讯分配给我们的appid是一个特殊的appid,由于是特殊性。在腾讯的后台查询不到,腾讯并没有单独提供后台给我们,直接修改回调地址。只能联系对方的技术人员修改
关于当时的背景:理解下面知识点
他们对一个用户(qq)的openid值是根据应用的appid生成的,也就是说:QQ号12348899,换一个appid,这个qq号对应的openid值就不同了。
这样子设计是为了安全考虑。否则不同的应用(比如a公司和b公司的应用),只要知道一个qq号码,就能获取到它的openid去其他地方使用。或者保存到自己的数据库里面。
现在目的要保证不一样,腾讯每个qq的openid值根据应用不同,而不同的。
妈妈网当时为了解决这样的问题:
由于32论坛的域名,都是不一样的一级域名,比如www.gzmama.cn、www.cdmama.cn。根据腾讯的qq机制,那么同一个qq用户在这些应用对应的openid值就不一样了。
想实现32论坛的qq用户,表现得是同一个openid。根据上面对腾讯openid的介绍,腾讯原来的机制无法满足。所以我们当时要求腾讯为我们单独开设了一个appid。
此appid是一个特殊的appid。把很多的应用合在一起。
同意授权,实际上就是根据用户的登录信息和appid生成一个code吗?这个code于这些信息是关联的。
回跳回来的时候,带这个code,凭借这个code可以获取access_token
我以前以为,获取到access_token,获取到code会不安全。但实际上授权的模式已经避免密码泄漏的问题了。
对方如何才能获取到code,code只是一个桥梁,一个中间作用。用完一次就删除了。
关键是对方怎么攻击呢?
我们的目的,就是要避免攻击者去获取用户的资源:照片,资料等信息。
必须通过用户临时授权,每授权一次才能进一步操作。
实际上可以直接返回access_token给客户端。但是不安全。必须要通过code来获取。
要隐藏。在服务器之间进行通信,这样很难抓到包。
我只要拿到access_token,那么也是可以获取用户信息了。
请求的时候带scope参数,这样子授权服务器就知道这个应用打算申请什么权限,这样可以提醒用户:你将要授权进行干嘛,你是否同意。
在oauth2.0协议中,提供了好几种模式。其中一种模式是直接把access_token放到url中返回给客户端了。这种是简化模式。存在token被泄漏的风险。
aaarticlea/png;base64,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" alt="" />
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
要有访问令牌access_token。访问令牌有个过期时间。如果要延长,就要使用refresh_token
来进行刷新。
access_token有效期是2个小时。refresh_token有效期是30天。
在qq中,Access_Token的有效期默认是3个月,过期后需要用户重新授权才能获得新的Access_Token。
这是php版本的 演示:
http://brentertainment.com/oauth2/lockdin/authorize?response_type=code&client_id=demoapp&redirect_uri=http%3A%2F%2Fbrentertainment.com%2Foauth2%2Fclient%2Freceive_authcode&state=6507ae4073f82d4a228eeef1a5af22d6#
https://github.com/bshaffer/oauth2-demo-php 这是官方提供的各个语言的demo
access_token与openid有什么区别呢?完成的意义有什么不一样呢?
在oautho2.0协议原文中,只有access_token,并没有openid的概念。所以openid只是在此基础上加的一个概念。
延长令牌,实际上是重新生成一个令牌: 重新生成refresh_token和access_token,先判断这个refresh_token是不是合法就行了。
access_token和openid都要实时生成。
使用一种算法来生成。这种算法必须是可逆的。也就是根据access_token能够反解出uid出来。openid的值也是要一样的。
使用一个密钥来生成。
desc算法吗?
这篇文章比较好讲述了openid和access_token的区别
http://desert3.iteye.com/blog/1701626
关于access_token被盗用的问题思考
想想现实生活中的例子,如果你捡到别人的火车票后,直接可以去乘车,以前是没有身份认证。我只认车票就放行。
这个动作就类似于,拿了access_token。
现在我们的思路与车票增加验证是一样的思路,是增加验证,把门槛提高。
具体这样做:你拿到access_token还不够。还需要传递密钥来验证才行。
就算你能偷到access_token还不够,你还得知道密钥才行。
现在明白access_token的有效期不是安全的关键因素。短一点的确是比长更加安全。
安全的核心因素是什么呢?就是增加障碍物,门槛增加。
考虑到用code交换access_token是服务器之间的交互。code是容易被知道,但是密钥很难知道。token交换的时候是服务器之间的通信了。
总结:思路就是增加多几道的验证门槛。
access_token准确的理解应该是这样:
是用户对第三方应用进行授权,授权可以在第三方应用进行登录。比如妈妈网的用户,可以在挂号网站进行登录。这需要用户进行授权才行。
授权过的用户会生成一个access_token,这个access_token要与应用id和用户id进行关联(对应关系存储起来)
这句话理解到了本质;OAuth可以把提供的Token,限制在一个网站特定时间段的的特定资源。
为什么通过access_token就能直接去获取用户的信息呢?根本不需要传递密钥去。
腾讯和微博在这方面是一样的模式。怎么来理解呢?
难道是基于这样一个假设:access_token不能随便被拿到。需要门槛。所以如果你能够拿到,那就说明你是正常的用户。实际上,我觉得如果是这样的理解,这种理解就是不够全面的。
把client_id和client_secret看成就是这个app访问授权中心的帐号和密码,这么来理解会更加通俗点
这里解释了,为什么access_token不要时间太长。
短期token和长效的身份凭据 - 原先的OAuth,会发行一个 有效期非常长的token(典型的是一年有效期或者无有效期限制),在OAuth 2.0中,server将发行一个短有效期的access token和长生命期的refresh token。
这将允许客户端无需用户再次操作而获取一个新的access token,并且也限制了access token的有效期。
通俗点说,access_token是故意设置比较短的时间。然后增加一个拥有长有效期的refresh_token,来延长access_token的。
access_token的生成方式?
最好是不要在 token 字串附上这些信息,即使是 hash 过的也不好,因为这样子就有机会可以假造 token 。要把 token 字串视为一个参照,服务器用这个 token 字串去查到真正的授权内容。
也就是说,access_token从安全角度来说,还是要用数据进行存储的。
Access Token 是一個字串,記載了特定的存取範圍 (scope) 、時效等等的資訊。
aaarticlea/png;base64,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" alt="" />
两次的access_token:
8576C24EEA96E6AC8B035C375A47C922
8576C24EEA96E6AC8B035C375A47C922
两次的刷新token:
5FC5A99DA4774E7E3569B8BDC1170138
5FC5A99DA4774E7E3569B8BDC1170138
B03CD9A2AF5BA4CDCEA541366EFF995E
52C78B6D6F1D10979B1ED46B5F8709A2
每一次一个code。
通过openid获取用户信息的接口思考
想要获取用户的资料,通过传递openid来获取。但是还不够。如果知道openid被泄漏了。那么就可以获取用户资料,不安全了。
所以还要增加一个门槛,要传递一个access_token。先验证access_token的合法性。access_token带有失效期。是与client_id和user_id关联了。
如果access_token合法,就能查询到对应的client_id和user_id的信息。
那么user_id知道了就方便查询哪个用户信息了。并且,我们还要验证openid的合法性。openid是根据user_id和client_id换成一定算法生成出来的。
所以查询出的client_id和user_id,就能用算法算出openid,假设是openid_b,与传递过来的openid_a对比,是否一致。
不一致,就要报错:openid错误。
总共两个错误:access_token错误和openid错误。
思考:
发现要研究,就把一些东西给研究透彻。然后自己能够回答一些关键性的疑惑。抛出一些问题来,才能解释掉。
比如oauth,不用输入帐号和密码就可以了。
以为有个access_token就可以。
那岂不是没输入帐号和密码就能拿到access_token。
oauth授权协议的原理的更多相关文章
- OAuth 授权过程工作原理讲解
转自:http://www.imooc.com/article/10931 在一个单位中,可能是存在多个不同的应用,比如学校会有财务的系统会有学生工作的系统,还有图书馆的系统等等,如果每个系统都用独立 ...
- OAuth认证协议原理分析及同步消息到Twitter和Facebook使用方法
OAuth有什么用?为什么要使用OAuth? twitter或豆瓣用户一定会发现,有时候,在别的网站,点登录后转到 twitter登录,之后转回原网站,你会发现你已经登录此网站了,这种网站就是这个效果 ...
- 转 OAuth 2.0授权协议详解
http://www.jb51.net/article/54948.htm 作者:阮一峰 字体:[增加 减小] 类型:转载 时间:2014-09-10我要评论 这篇文章主要介绍了OAuth 2.0授权 ...
- 什么是OAuth授权?
什么是OAuth授权? 一.什么是OAuth协议 OAuth(开放授权)是一个开放标准. 允许第三方网站在用户授权的前提下访问在用户在服务商那里存储的各种信息. 而这种授权无需将用户提供用户名和密 ...
- oauth2.0授权协议
参考文章 一.OAuth是什么? OAuth的英文全称是Open Authorization,它是一种开放授权协议.OAuth目前共有2个版本,2007年12月的1.0版(之后有一个修正版1.0a)和 ...
- 什么是OAuth授权
什么是OAuth授权? 一.什么是OAuth协议 OAuth(开放授权)是一个开放标准. 允许第三方网站在用户授权的前提下访问在用户在服务商那里存储的各种信息. 而这种授权无需将用户提供用户名和密 ...
- iOS之新浪微博的OAuth授权
新浪微博的OAuth授权 之前通过新浪微博开发平台写过微博的的项目,现在就开始总结下各个方面的知识点,一个是为了加深印象.巩固知识,另一个记录自己学习过程,希望自己在开发这条路上有所积累,为以后的道路 ...
- OAuth授权过程
什么是OAuth授权? 一.什么是OAuth协议 OAuth(开放授权)是一个开放标准,所谓OAuth(即Open Authorization,开放授权),它是为用户资源授权提供了一种安全简单的标准, ...
- [iOS微博项目 - 2.0] - OAuth授权3步
A.概念 OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用 ...
随机推荐
- Web GIS 离线地图
Web GIS 离线地图 1,基于瓦片的离线地图下载 博客园 阿凡卢 提供了离线地图的下载工具,下载地址:http://pan.baidu.com/s/1hqvQr7e 具体使用见 参考资料2 阿凡卢 ...
- IE11 Enterprise Mode
对IE11引入的Enterprise Mode进行了一些总结,对查阅的一些参考资料直接引用了英文,需要注意的地方用中文进行了一些注解.供大家参考. 1. The purpose of introduc ...
- 允许CEF跨域访问iframe
默认情况下,如果嵌入本地Web页面,并在页面内部使用iframe来显示一个在线页面,加载的过程中会触发一个未捕获异常,虚函数CefV8ContextHandler::OnUncaughtExcepti ...
- 锁屏上显示Activity
在Android中,有些比较强的提醒,需要用户紧急处理的内容.需要唤醒屏幕,甚至在锁定屏幕的情况下,也要显示出来.例如,来电界面和闹钟提醒界面.这是怎样实现的呢? 其实,实现起来非常简单.只要给Act ...
- Oracle数据库入门——物化视图语法
一.Oracle物化视图语法 create materialized view [view_name]refresh [fast|complete|force][on [commit|demand] ...
- 实时流式计算框架Storm 0.9.0发布通知(中文版)
Storm0.9.0发布通知中文翻译版(2013/12/10 by 富士通邵贤军 有错误一定告诉我 shaoxianjun@hotmail.com^_^) 我们很高兴宣布Storm 0.9.0已经成功 ...
- js最新手机号码、身份证正则表达式
身份证正则: //身份证正则表达式(15位) isIDCard1=/^[-]\d{}((\d)|([-]))(([||]\d)|[-])\d{}$/; //身份证正则表达式(18位) isIDCard ...
- STL中的set/multiset小结
(1)使用set/multiset之前必须包含头文件<set>:#include<set> (2)namespace std{ template <class T, cl ...
- 程序设置横屏后,锁屏时会被销毁一遍,解锁时又重新加载onCreat的问题解决
今天在写一个应用的时候,因为需要设置成横屏模式,所以在Manifest里面的Activity里面加了两个参数设置: android:screenOrientation="landscape& ...
- ruby -- 进阶学习(十四)设置background-image(解决无法获取图片路径问题)
基于rails4.0环境 为了美化界面,添加背景图片,于是又傻逼了一回~~ 一开始在xxx.html.erb中添加:(注:图片的路径为:app/asssets/images/background.jp ...