OpenID 和 OAuth 的区别及第三方登录的安全隐患分析
转自:http://itindex.net/detail/48552-openid-oauth-%E6%96%B9%E7%99%BB
不知道什么时候开始,我们已经习惯了点击“用XX帐号登录”或者 "Login with XX" 来访问网站,但是大多数人可能都不知道这背后涉及的事有多复杂。
OpenID 和OAuth 完全是为了两种不同的需求而生
OpenID 的目标是为了帮助网站确认一个用户的身份 OAuth 的目标是为了授权第三方在可控范围下访问用户资源
OpenID 是怎么认证用户的?
一个网站如果想要接入 OpenID 认证是非常简单的,不需要创建应用,不需要 App Key ,不需要 Secret ,只需要将用户导向 OpenID Provider 的 Entry 并带上 Callback ,用户只要同意提供信息,你就可以拿到这个用户的“唯一标识”。
请注意这里我使用了“唯一标识”这种说法,因为对于网站来说,OpenID Provider 提供的既不是用户的 UID ,也不是用户的 E-Mail ,比如 Google 在默认情况下提供的就是一个几十位长的字符串,这个字符串是随机生成的,第三方网站无法从中获得用户的任何私人信息。这么说可能很抽象,举个例子:
比如我用 Google 的 OpenID 服务登录 example.com , example.com 先把我导向 Google 的授权页面,我使用 Google 帐号 test@gmail.com 登录并同意后,页面跳回 example.com , example.com 拿到了我的“唯一标识”,这个唯一标识可能是 cd5f2126c2b2f97ca2d446e52c6ff4baea56fd4bcfcea30afcaaf6b73bcb04a1 , example.com 从这个字符串里无法获得任何 test@gmail.com 的个人信息(甚至连邮箱地址也不知道), example.com 只知道以后只要使用谷歌登录并返回 cd5f2126c2b2f97ca2d446e52c6ff4baea56fd4bcfcea30afcaaf6b73bcb04a1 这个标识符,那就是我在登录。
显而易见,OpenID 是专为登录认证而生,它使用简单,门槛很低,但是如果你想在认证过程中获得用户的其他信息(比如 E-Mail )就得多做一步了。
如何在 OpenID 认证的过程中获得用户的部分信息?
传统的 OpenID 是做不到这一点的,你只能拿到“唯一标识”。不过新版的 OpenID 引入了 "OpenID attribute exchange" 这个概念,这样第三方可以在用户的许可范围内获得用户的部分具体信息。
还是上面的例子,如果 example.com 告诉 Google ,我想知道这个用户的 E-Mail 地址,谷歌就会在授权页面告诉用户:“example.com 想要你的 E-Mail 地址”,这时如果用户点击同意,example.com 就能在回调请求中拿到 test@gmail.com 这个地址。
对于网站能拿到的信息,不同 Provider 有不同的规定,一般来说包括
aim, blog, country, dob (date of birth), email, fullname, gender, icq, image, jabber, language, msn, nickname, phone, postcode, skype, timezone, website, yahoo
等等。
那么,OAuth 又是怎么认证用户的?
与 OpenID 相比,网站想接入 OAuth 要稍微麻烦点,网站需要先创建应用,拿到 Key 和 Secret ,才能接入 Provider 。
OAuth 的授权过程并不是身份认证的过程,这一点需要特别清楚,网站走完OAuth 流程并拿到用户的授权 token 后还需要通过 token 调用相应的用户信息接口才能获得“唯一标识”,举个例子:
我想通过新浪微博登录 example.com , example.com 要先把我 redirect 到新浪微博的授权页面,我通过微博帐号登录并授权后,页面跳回 example.com , example.com 拿到我的访问 token 后还要再调用一个接口来获得我的新浪会员 UID ,这个 UID 就是新浪用户的“唯一标识”了。
可以看出,OAuth 相对于 OpenID 最大的区别就是,网站实际上是拿到了你的帐户访问权限继而确认你的身份,这是一个安全隐患,因为网站在拿到你的“唯一标识”的同时还拿到了一把你的账户的 “临时钥匙”。至于网站会不会拿这把钥匙“干坏事”,这个只有站长心里清楚。同时 OAuth 还比 OpenID 多了几个额外的请求步骤,登录所费时间一定是长于 OpenID 的。
大多数的网民是没有这种意识的,他们对“通过XX登录”的认证过程中的提示早已视而不见:

有多少人真正注意过左边的文字?

豆瓣写的更清楚,XXX应用“希望操作你在豆瓣上的数据”而不是“希望使用你的豆瓣账号来登录XXX”
国内外主要服务商认证方式对比
提供商 认证方式 认证后网站获得的权限 安全程度
| OpenID + OAuth | 如果使用OpenID,网站无法获得任何额外权限(包括获得你的Google账户名称),如果使用OAuth,网站须明确说明需要访问哪些服务的权限并经过用户逐项同意 | 高 | |
| OAuth | 默认授权情况下只能读取你的公开信息(不包含E-Mail地址),如果网站需要更高级权限需要明确声明并经过用户逐项同意 | 高 | |
| QQ空间 | OAuth | 默认授权情况下只能读取你的公开信息(不包含QQ号),如果网站需要更高级权限需要明确声明并经过用户逐项同意 | 高 |
| 新浪微博 | OAuth | 默认授权情况下可以获得你的所有信息(私信及身份证号、姓名等除外),并可以你的身份操作绝大多数微博功能 | 低 |
| Windows Live | OAuth | 默认授权情况下只能读取你的“唯一标识”,如果网站需要更高级权限需要明确声明并经过用户逐项同意,默认情况下基本类似于OpenID | 高 |
| 腾讯微博 | OpenID + OAuth | 如果使用OpenID,网站无法获得任何额外权限,如果使用OAuth,默认会获得用户所有操作的权限,除非应用明确声明只需要部分权限 | 使用OpenID时, 高使用OAuth时, 中 |
| 搜狐微博 | OAuth | 默认授权情况下可以获得你的绝大多数信息,并可以你的身份操作绝大多数微博功能 | 低 |
| 网易微博 | OAuth | 默认授权情况下可以获得你的绝大多数信息,并可以你的身份操作绝大多数微博功能 | 低 |
| 百度 | OAuth | 默认授权情况下只能读取你的公开信息(UID、百度帐户名),如果网站需要更高级权限需要明确声明并经过用户逐项同意 | 高 |
| 人人 | OAuth | 默认授权情况下只能读取你的公开信息(UID、好友关系等),如果网站需要更高级权限需要明确声明并经过用户逐项同意 | 高 |
| 开心网 | OAuth | 默认授权情况下只能读取你的公开信息,如果网站需要更高级权限需要明确声明并经过用户逐项同意 | 高 |
总结
总体来说,国外的网站都比较正规,第三方网站几乎无法获得任何私人信息,而国内网站对个人信息的保护水平高低不齐,某些网站甚至没有任何保护,新浪微博等网站的“第三方接入”,用一句话来说,不管你敢不敢用,我反正是不敢用。
原文: https://www.idndx.com/2012/04/23/openid-vs-oauth-and-the-security-risk-of-oauth-login/
OpenID 和 OAuth 的区别及第三方登录的安全隐患分析的更多相关文章
- 理解OpenID和OAuth的区别
在项目开发中,我们经常说授权认证,经常把他们放到一起去描述,那两者在本质上是有区别的,OpenID和OAuth就是我们说的认证和授权. OpenID:Authentication 认证 OAuth : ...
- CocoaPods的安装及使用/利用开源库Diplomat实现分享及第三方登录/git的使用
<<史上最简洁版本>> 1.gem sources -l查看 当前的源 //1.1 sudo -i..以下都是以管理员的身份来操作的 2.gem sources --remov ...
- OAuth及第三方登录
现在的生活中运用互联网的有好多地方,我们既要申请微博,申请博客,申请邮箱等等:哪怕登录一个小网址看点东西都要注册登录,不过现在好多了:有了第三方登录,再也不用担心这不够用的脑子整天记忆账号和密码了,只 ...
- 微信、QQ、新浪微博等第三方登录,你想知道的都在这了(上) 微信、QQ、新浪微博等第三方登录,你想知道的都在这了(下)
微信.QQ.新浪微博等第三方登录,你想知道的都在这了(上):https://www.jianshu.com/p/133d84042483 微信.QQ.新浪微博等第三方登录,你想知道的都在这了(下):h ...
- SpringCloud微服务实战——搭建企业级开发框架(四十一):扩展JustAuth+SpringSecurity+Vue实现多租户系统微信扫码、钉钉扫码等第三方登录
前面我们详细介绍了SSO.OAuth2的定义和实现原理,也举例说明了如何在微服务框架中使用spring-security-oauth2实现单点登录授权服务器和单点登录客户端.目前很多平台都提供了单 ...
- IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API
IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...
- ASP.NET MVC中三方登录: 微软、谷歌、Office365
创建一个MVC的工程,在Startup.Auth.cs文件中,我们能看到这样的一些代码: 这其实是微软已经帮我们实现好的三方登录的接口,我们只需要创建相应的开发者账号,并在其中配置好跟我们应用程序相关 ...
- 一个功能完备的.NET开源OpenID Connect/OAuth 2.0框架——IdentityServer3
今天推荐的是我一直以来都在关注的一个开源的OpenID Connect/OAuth 2.0服务框架--IdentityServer3.其支持完整的OpenID Connect/OAuth 2.0标准, ...
- AppDelegate减负之常用三方封装 - 友盟分享 / 三方登录篇
之前完成了 AppDelegate减负之常用三方封装 - 友盟推送篇: http://www.cnblogs.com/zhouxihi/p/7113511.html 今天接着来完成 - 友盟分享和三方 ...
随机推荐
- java组件学习15天
Linuxdocker redminegitlabnginxmavenkibanakafkaspringspring cloudLucene 搭建基本使用
- 升级wampserver3.0的PHP版本到7.1
windows系统下,目前wampserver的最高版本为3.0.6,其中的PHP最高版本为7.0.10,博主想要安装laravel5.6最新版本,却看到需要PHP版本>=7.1.3,无奈之下, ...
- 设置npm淘宝代理
来源:https://cnodejs.org/topic/4f9904f9407edba21468f31e 镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在 ...
- Android ExpandableListActivity
======MainActivity.java===================================== package com.zys.myexpandablelistactivit ...
- Silly Java-Final 关键字
Final 关键字 adj. 最终的:最后的:决定性的:不可改变的 1.修饰变量 final variable 意味 [最后的变量,不可改变的变量即常量] Java中该关键字即代表常量 修饰基本类型的 ...
- 【android】activity的4种启动模式简介
首先咱必须知道,activity是以栈(后进先出)的结构进行管理的. 当活动A启动了活动B时,A被压入到栈内,B在栈的最顶层.当B调用finish()结束活动时,B从栈弹出,此时A在栈的最顶层. 我们 ...
- Lua 数学类
数学类主要有Vec2(坐标向量).Size(尺寸).Rect(矩形). 创建 在Lua中创建的 Vec2.Size.Rect 都是一个table类型. 其中只有相应的成员变量,没有相关的函数运算. c ...
- iOS 机智的修改导航栏返回事件
只需要一个在自定义的基类控制器的UIBarButtonItem,在需要的时候继承该类,实现selector方法即可(如果大部分处理都是一样的,只需在基类控制器内实现操作). self.navigati ...
- RedisTemplate和StringRedisTemplate
最近在开始在学习Redis以及如何在Java当中去使用Redis,Redis是什么我这里就不说了. 我主要想说的是Redis和Java当中Spring结合起来的时候,使用到的RedisTemplate ...
- Android事件处理下(按键、触摸屏和滚动球的一些实现细节)
http://www.cnblogs.com/andtt/articles/2145563.html 对于按键事件,调用mDevices[i]->layoutMap->map进行映射.映射 ...