不知道什么时候开始,我们已经习惯了点击“用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 默认授权情况下只能读取你的公开信息,如果网站需要更高级权限需要明确声明并经过用户逐项同意 高
来总结一下吧

总体来说,国外的网站都比较正规,第三方网站几乎无法获得任何私人信息,而国内网站对个人信息的保护水平高低不齐,某些网站甚至没有任何保护,新浪微博等网站万能钥匙式的“第三方接入”,用一句话来说,不管你敢不敢用,我反正是不敢用。

转自OpenID和OAuth的区别及第三方登录的安全隐患分析 | Dndx的温暖小窝.

- EOF -