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/
转载于:https://www.cnblogs.com/Ceri/p/7776581.html
OpenID 和 OAuth 的区别及第三方登录的安全隐患分析相关推荐
- OAuth协议(三方登录授权)
1.什么是三方登录? 三方登录就是通过第三方应用程序的账号密码, 快速的获取用户相关的信息实现登录 例如: QQ登录 点击QQ登录按钮之后,就会要求用户输入QQ的账号和密码 只要用户输入了QQ的账号和 ...
- apple oauth 三方登录
网站需要使用apple 三方登录,研究了一下,记录如下: 目录 配置 正式开发(oauth2.0) 1.登录授权页面 2.接收授权码code,向apple服务器申请token 配置 我们拥有一个苹果开 ...
- OAuth机制_web站点接入微软azure账号进行三方登录
文章目录 ⭐前言 ⭐微软三方登录流程
- 三方登录(微博为例)
三方登录介绍 三方登录流程(以微博为例) 1)前端获取认证code 1. 在Vue页面加载时动态发送请求获取微博授权url 2. django收到请求的url后,通过微博应用ID(client_id) ...
- A072_前台登录_三方登录
目录 内容介绍 1. 前台登录-账号登录 1.1.前台登录 1.2.axios携带token-common.js 1.3.axios后置处理后台拦截错误-common.js 1.4.前台登录拦截-co ...
- 安卓三方登录趟坑,QQ,微信,微博,Twitter,Facebook,Instagram
前言 最近给app加入三方登录,由于比较多,所以就用的友盟统一登录,会比一个一个配置方便点 正文 先说QQ,微信,微博: 国内QQ,微信,微博三方登录其实还行,并没有太多坑,文档也挺完善的. 但是需要 ...
- 兄弟们,就是干 微信三方登录绝对干货
微信第三方登录绝对干货 课程介绍 1. 用户登录-账号登录;(掌握) 2. 三方登录概述;(理解) 3. 三方登录协议-Oauth2.0;(了解) 4. 三方登录选择-微信三方登录;(掌握) ...
- 微博三方登录原理讲解
微博三方登录流程 1.1 前端获取认证code 1.在Vue页面加载时 动态发送请求获取微博授权url 2.django收到请求的url后,通过微博 应用ID(client_id)和回调地址(redi ...
- IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API
IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...
最新文章
- swift - label 的font 设置 文字字体和大小
- 在Anacoda中管理多个版本Python
- 新建idea加入的一句话,键值对
- 数学建模学习笔记——相关性分析
- java多线程w3c_多线程
- 解决Gradle生成Eclipse支持后,发布到Tomcat丢失依赖jar包的问题
- 看看你爱的他今天是什么‘颜色‘ -- Python爬取微博评论制作专属偶像词云
- PHP-线程安全与非线程安全版本的区别
- 【转】JAVA成长之路
- 调用支付jsapi缺少参数:appid_JAVA实现微信支付功能
- pycharm使用pip install安装速度慢,更换镜像源
- 使用万用表来进行简易的运放芯片配对
- 结构化程序设计与面向对象程序设计特点
- poe工业以太网交换机可以当普通交换机用吗,poe工业以太网交换机有哪些优势
- linux 临时文件夹设置,Linux 系统 tmp 目录的安全设置
- DFRobot-Fermion环境传感器详细介绍和应用
- word插入图表目录的时候同时插入了原图的解决办法
- 国产CAD软件对于AutoCAD,更适合哪种?
- Get 和 Post 请求
- RP50 RP55 吉他效果器音色推荐
热门文章
- 3、JMSN~Maven安装
- datatables 获取 pageLength 和 pageStart,重新获取table数据
- jetbrains从入门到卸载 (前言) 为什么要jetbrains
- ArcSDE初学者需要弄清楚的几个问题(转载)
- Windows Android Studio生成javadoc
- 退出窗口[置顶] 退出Activity的方法
- 典型的Linux系统启动需要完成的服务
- Win7系统下共享文件夹后共享文件夹上的小锁图标取消方法
- Android 可视化界面编辑器无法显示界面问题的终极解决方案
- android studio 运行 Java Application