转自:http://itindex.net/detail/48552-openid-oauth-%E6%96%B9%E7%99%BB

发表时间:2014-03-13 19:09 | 作者:天梯梦
出处:http://www.iteye.com

不知道什么时候开始,我们已经习惯了点击“用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”

国内外主要服务商认证方式对比

提供商 认证方式 认证后网站获得的权限 安全程度

Google OpenID + OAuth 如果使用OpenID,网站无法获得任何额外权限(包括获得你的Google账户名称),如果使用OAuth,网站须明确说明需要访问哪些服务的权限并经过用户逐项同意
Facebook 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 的区别及第三方登录的安全隐患分析相关推荐

  1. OAuth协议(三方登录授权)

    1.什么是三方登录? 三方登录就是通过第三方应用程序的账号密码, 快速的获取用户相关的信息实现登录 例如: QQ登录 点击QQ登录按钮之后,就会要求用户输入QQ的账号和密码 只要用户输入了QQ的账号和 ...

  2. apple oauth 三方登录

    网站需要使用apple 三方登录,研究了一下,记录如下: 目录 配置 正式开发(oauth2.0) 1.登录授权页面 2.接收授权码code,向apple服务器申请token 配置 我们拥有一个苹果开 ...

  3. OAuth机制_web站点接入微软azure账号进行三方登录

    文章目录 ⭐前言 ⭐微软三方登录流程

  4. 三方登录(微博为例)

    三方登录介绍 三方登录流程(以微博为例) 1)前端获取认证code 1. 在Vue页面加载时动态发送请求获取微博授权url 2. django收到请求的url后,通过微博应用ID(client_id) ...

  5. A072_前台登录_三方登录

    目录 内容介绍 1. 前台登录-账号登录 1.1.前台登录 1.2.axios携带token-common.js 1.3.axios后置处理后台拦截错误-common.js 1.4.前台登录拦截-co ...

  6. 安卓三方登录趟坑,QQ,微信,微博,Twitter,Facebook,Instagram

    前言 最近给app加入三方登录,由于比较多,所以就用的友盟统一登录,会比一个一个配置方便点 正文 先说QQ,微信,微博: 国内QQ,微信,微博三方登录其实还行,并没有太多坑,文档也挺完善的. 但是需要 ...

  7. 兄弟们,就是干 微信三方登录绝对干货

    微信第三方登录绝对干货 课程介绍 1. 用户登录-账号登录;(掌握) 2. 三方登录概述;(理解) 3. 三方登录协议-Oauth2.0;(了解) 4. 三方登录选择-微信三方登录;(掌握) ...

  8. 微博三方登录原理讲解

    微博三方登录流程 1.1 前端获取认证code 1.在Vue页面加载时 动态发送请求获取微博授权url 2.django收到请求的url后,通过微博 应用ID(client_id)和回调地址(redi ...

  9. IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API

    IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...

最新文章

  1. swift - label 的font 设置 文字字体和大小
  2. 在Anacoda中管理多个版本Python
  3. 新建idea加入的一句话,键值对
  4. 数学建模学习笔记——相关性分析
  5. java多线程w3c_多线程
  6. 解决Gradle生成Eclipse支持后,发布到Tomcat丢失依赖jar包的问题
  7. 看看你爱的他今天是什么‘颜色‘ -- Python爬取微博评论制作专属偶像词云
  8. PHP-线程安全与非线程安全版本的区别
  9. 【转】JAVA成长之路
  10. 调用支付jsapi缺少参数:appid_JAVA实现微信支付功能
  11. pycharm使用pip install安装速度慢,更换镜像源
  12. 使用万用表来进行简易的运放芯片配对
  13. 结构化程序设计与面向对象程序设计特点
  14. poe工业以太网交换机可以当普通交换机用吗,poe工业以太网交换机有哪些优势
  15. linux 临时文件夹设置,Linux 系统 tmp 目录的安全设置
  16. DFRobot-Fermion环境传感器详细介绍和应用
  17. word插入图表目录的时候同时插入了原图的解决办法
  18. 国产CAD软件对于AutoCAD,更适合哪种?
  19. Get 和 Post 请求
  20. RP50 RP55 吉他效果器音色推荐

热门文章

  1. 3、JMSN~Maven安装
  2. datatables 获取 pageLength 和 pageStart,重新获取table数据
  3. jetbrains从入门到卸载 (前言) 为什么要jetbrains
  4. ArcSDE初学者需要弄清楚的几个问题(转载)
  5. Windows Android Studio生成javadoc
  6. 退出窗口[置顶] 退出Activity的方法
  7. 典型的Linux系统启动需要完成的服务
  8. Win7系统下共享文件夹后共享文件夹上的小锁图标取消方法
  9. Android 可视化界面编辑器无法显示界面问题的终极解决方案
  10. android studio 运行 Java Application