不知道什么時(shí)候開始,我們已經(jīng)習(xí)慣了點(diǎn)擊“用XX帳號(hào)登錄”或者 "Login with XX" 來訪問網(wǎng)站,但是大多數(shù)人可能都不知道這背后涉及的事有多復(fù)雜。
?
OpenID 和OAuth 完全是為了兩種不同的需求而生
OpenID 的目標(biāo)是為了幫助網(wǎng)站確認(rèn)一個(gè)用戶的身份 OAuth 的目標(biāo)是為了授權(quán)第三方在可控范圍下訪問用戶資源
?
OpenID 是怎么認(rèn)證用戶的?
一個(gè)網(wǎng)站如果想要接入 OpenID 認(rèn)證是非常簡(jiǎn)單的,不需要?jiǎng)?chuàng)建應(yīng)用,不需要 App Key ,不需要 Secret ,只需要將用戶導(dǎo)向 OpenID Provider 的 Entry 并帶上 Callback ,用戶只要同意提供信息,你就可以拿到這個(gè)用戶的“唯一標(biāo)識(shí)”。
請(qǐng)注意這里我使用了“唯一標(biāo)識(shí)”這種說法,因?yàn)閷?duì)于網(wǎng)站來說,OpenID Provider 提供的既不是用戶的 UID ,也不是用戶的 E-Mail ,比如 Google 在默認(rèn)情況下提供的就是一個(gè)幾十位長(zhǎng)的字符串,這個(gè)字符串是隨機(jī)生成的,第三方網(wǎng)站無法從中獲得用戶的任何私人信息。這么說可能很抽象,舉個(gè)例子:
比如我用 Google 的 OpenID 服務(wù)登錄
example.com
, example.com 先把我導(dǎo)向 Google 的授權(quán)頁(yè)面,我使用 Google 帳號(hào)
test@gmail.com
登錄并同意后,頁(yè)面跳回
example.com
,
example.com
拿到了我的“唯一標(biāo)識(shí)”,這個(gè)唯一標(biāo)識(shí)可能是
cd5f2126c2b2f97ca2d446e52c6ff4baea56fd4bcfcea30afcaaf6b73bcb04a1
,
example.com
從這個(gè)字符串里無法獲得任何
test@gmail.com
的個(gè)人信息(甚至連郵箱地址也不知道),
example.com
只知道以后只要使用谷歌登錄并返回
cd5f2126c2b2f97ca2d446e52c6ff4baea56fd4bcfcea30afcaaf6b73bcb04a1
這個(gè)標(biāo)識(shí)符,那就是我在登錄。
顯而易見,OpenID 是專為登錄認(rèn)證而生,它使用簡(jiǎn)單,門檻很低,但是如果你想在認(rèn)證過程中獲得用戶的其他信息(比如 E-Mail )就得多做一步了。
?
如何在 OpenID 認(rèn)證的過程中獲得用戶的部分信息?
傳統(tǒng)的 OpenID 是做不到這一點(diǎn)的,你只能拿到“唯一標(biāo)識(shí)”。不過新版的 OpenID 引入了 " OpenID attribute exchange " 這個(gè)概念,這樣第三方可以在用戶的許可范圍內(nèi)獲得用戶的部分具體信息。
還是上面的例子,如果
example.com
告訴 Google ,我想知道這個(gè)用戶的 E-Mail 地址,谷歌就會(huì)在授權(quán)頁(yè)面告訴用戶:“example.com 想要你的 E-Mail 地址”,這時(shí)如果用戶點(diǎn)擊同意,
example.com
就能在回調(diào)請(qǐng)求中拿到
test@gmail.com
這個(gè)地址。
對(duì)于網(wǎng)站能拿到的信息,不同 Provider 有不同的規(guī)定,一般來說包括
aim, blog, country, dob (date of birth), email, fullname, gender, icq, image, jabber, language, msn, nickname, phone, postcode, skype, timezone, website, yahoo
等等。
?
那么,OAuth 又是怎么認(rèn)證用戶的?
與 OpenID 相比,網(wǎng)站想接入 OAuth 要稍微麻煩點(diǎn),網(wǎng)站需要先創(chuàng)建應(yīng)用,拿到 Key 和 Secret ,才能接入 Provider 。
OAuth 的授權(quán)過程并不是身份認(rèn)證的過程,這一點(diǎn)需要特別清楚,網(wǎng)站走完OAuth 流程并拿到用戶的授權(quán) token 后還需要通過 token 調(diào)用相應(yīng)的用戶信息接口才能獲得“唯一標(biāo)識(shí)”,舉個(gè)例子:
我想通過新浪微博登錄
example.com
,
example.com
要先把我 redirect 到新浪微博的授權(quán)頁(yè)面,我通過微博帳號(hào)登錄并授權(quán)后,頁(yè)面跳回
example.com
,
example.com
拿到我的訪問 token 后還要再調(diào)用一個(gè)接口來獲得我的新浪會(huì)員 UID ,這個(gè) UID 就是新浪用戶的“唯一標(biāo)識(shí)”了。
可以看出,OAuth 相對(duì)于 OpenID 最大的區(qū)別就是,網(wǎng)站實(shí)際上是拿到了你的帳戶訪問權(quán)限繼而確認(rèn)你的身份,這是一個(gè)安全隱患,因?yàn)榫W(wǎng)站在拿到你的“唯一標(biāo)識(shí)”的同時(shí)還拿到了一把你的賬戶的 “臨時(shí)鑰匙”。至于網(wǎng)站會(huì)不會(huì)拿這把鑰匙“干壞事”,這個(gè)只有站長(zhǎng)心里清楚。同時(shí) OAuth 還比 OpenID 多了幾個(gè)額外的請(qǐng)求步驟,登錄所費(fèi)時(shí)間一定是長(zhǎng)于 OpenID 的。
大多數(shù)的網(wǎng)民是沒有這種意識(shí)的,他們對(duì)“通過XX登錄”的認(rèn)證過程中的提示早已視而不見:
有多少人真正注意過左邊的文字?
豆瓣寫的更清楚,XXX應(yīng)用“希望操作你在豆瓣上的數(shù)據(jù)”而不是“希望使用你的豆瓣賬號(hào)來登錄XXX”
?
國(guó)內(nèi)外主要服務(wù)商認(rèn)證方式對(duì)比
提供商 認(rèn)證方式 認(rèn)證后網(wǎng)站獲得的權(quán)限 安全程度| OpenID + OAuth | 如果使用OpenID,網(wǎng)站無法獲得任何額外權(quán)限(包括獲得你的Google賬戶名稱),如果使用OAuth,網(wǎng)站須明確說明需要訪問哪些服務(wù)的權(quán)限并經(jīng)過用戶逐項(xiàng)同意 | 高 | |
| OAuth | 默認(rèn)授權(quán)情況下只能讀取你的公開信息(不包含E-Mail地址),如果網(wǎng)站需要更高級(jí)權(quán)限需要明確聲明并經(jīng)過用戶逐項(xiàng)同意 | 高 | |
| QQ空間 | OAuth | 默認(rèn)授權(quán)情況下只能讀取你的公開信息(不包含QQ號(hào)),如果網(wǎng)站需要更高級(jí)權(quán)限需要明確聲明并經(jīng)過用戶逐項(xiàng)同意 | 高 |
| 新浪微博 | OAuth | 默認(rèn)授權(quán)情況下可以獲得你的所有信息(私信及身份證號(hào)、姓名等除外),并可以你的身份操作絕大多數(shù)微博功能 | 低 |
| Windows Live | OAuth | 默認(rèn)授權(quán)情況下只能讀取你的“唯一標(biāo)識(shí)”,如果網(wǎng)站需要更高級(jí)權(quán)限需要明確聲明并經(jīng)過用戶逐項(xiàng)同意,默認(rèn)情況下基本類似于OpenID | 高 |
| 騰訊微博 | OpenID + OAuth | 如果使用OpenID,網(wǎng)站無法獲得任何額外權(quán)限,如果使用OAuth,默認(rèn)會(huì)獲得用戶所有操作的權(quán)限,除非應(yīng)用明確聲明只需要部分權(quán)限 | 使用OpenID時(shí), 高 使用OAuth時(shí), 中 |
| 搜狐微博 | OAuth | 默認(rèn)授權(quán)情況下可以獲得你的絕大多數(shù)信息,并可以你的身份操作絕大多數(shù)微博功能 | 低 |
| 網(wǎng)易微博 | OAuth | 默認(rèn)授權(quán)情況下可以獲得你的絕大多數(shù)信息,并可以你的身份操作絕大多數(shù)微博功能 | 低 |
| 百度 | OAuth | 默認(rèn)授權(quán)情況下只能讀取你的公開信息(UID、百度帳戶名),如果網(wǎng)站需要更高級(jí)權(quán)限需要明確聲明并經(jīng)過用戶逐項(xiàng)同意 | 高 |
| 人人 | OAuth | 默認(rèn)授權(quán)情況下只能讀取你的公開信息(UID、好友關(guān)系等),如果網(wǎng)站需要更高級(jí)權(quán)限需要明確聲明并經(jīng)過用戶逐項(xiàng)同意 | 高 |
| 開心網(wǎng) | OAuth | 默認(rèn)授權(quán)情況下只能讀取你的公開信息,如果網(wǎng)站需要更高級(jí)權(quán)限需要明確聲明并經(jīng)過用戶逐項(xiàng)同意 | 高 |
?
總結(jié)
總體來說,國(guó)外的網(wǎng)站都比較正規(guī),第三方網(wǎng)站幾乎無法獲得任何私人信息,而國(guó)內(nèi)網(wǎng)站對(duì)個(gè)人信息的保護(hù)水平高低不齊,某些網(wǎng)站甚至沒有任何保護(hù),新浪微博等網(wǎng)站的“第三方接入”,用一句話來說,不管你敢不敢用,我反正是不敢用。
?
原文: https://www.idndx.com/2012/04/23/openid-vs-oauth-and-the-security-risk-of-oauth-login/
?
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

