OpenID 和 OAuth 的区别及第三方登录的安全隐患分析
轉自: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”
?
國內外主要服務商認證方式對比
提供商 認證方式 認證后網站獲得的權限 安全程度
| 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 的区别及第三方登录的安全隐患分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SSH无密码登录:只需两个简单步骤 (L
- 下一篇: 由于权限引起的Tomcat中项目某些页面