不知道什么時候開始,我們已經習慣了點擊“用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/
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
