什么是OAuth
如今很多網站的功能都強調彼此間的交互,因此我們需要一種簡單,標准的解決方案來安全的完成應用的授權,於是,OAuth應運而生,看看官網對其的定義:
An open protocol to allow secure API authorization in a simple and standard method from desktop and web applications.
一個典型的OAuth應用通常包括三種角色,分別是:
- Consumer:消費方
- Service Provider:服務提供者
- User:用戶
用戶好理解,不必多言,消費方和服務提供者則需要解釋一下,舉例來說:假設我們做了一個SNS,它有一個功能,可以讓會員把他們在Google上的聯系人導入到SNS上,那么此時的消費方就是SNS,而服務提供者則是Google。
注:Google APIs支持OAuth。
消費方如果想使用服務提供者的OAuth功能,通常需要先申請兩樣東西:
- Consumer Key
- Consumer Secret
當消費方生成簽名的時候,會用到它們。
一個典型的OAuth流程通常如下圖所示:
- A:消費方請求Request Token
- B:服務提供者授權Request Token
- C:消費方定向用戶到服務提供者
- D:獲得用戶授權后,服務提供者定向用戶到消費方
- E:消費方請求Access Token
- F:服務提供者授權Access Token
- G:消費方訪問受保護的資源
基本就是用Request Token換取Access Token的過程。這里需要注意的是,對服務提供者而言,Request Token和Access Token的生命周期不一樣,通常,Request Token的生命周期很短,一般在一個小時以內,這樣相對安全一些;而Access Token的生命周期很長,往往是無限,如此一來,消費方就可以把它保存起來,以后的操作就無需用戶再授權了,即便用戶修改賬號密碼,也不會受影響,當然,用戶可以廢除消費方的授權。
有腿的OAuth
我們前面描述的OAuth,被稱為三條腿的OAuth(3-Legged OAuth),這也是OAuth的標准版本。這里所謂的“三條腿”,指的是授權過程中涉及三步流程。不過有些情況下,不需要用戶的參與,此時就產生了一個變體,被稱作兩條腿的OAuth(2-Legged OAuth),兩條腿的OAuth和三條腿的OAuth相比,因為沒有用戶的參與,所以在流程中就不會涉及用戶授權的環節,而主要是通過Consumer Key和Consumer Secret來完成簽名的,此時的Consumer Key和Consumer Secret基本等價於賬號和密碼的作用。
OAuth和OpenID的區別
OAuth關注的是authorization;而OpenID側重的是authentication。從表面上看,這兩個英文單詞很容易混淆,但實際上,它們的含義有本質的區別:
- authorization: n. 授權,認可;批准,委任
- authentication: n. 證明;鑒定;證實
OAuth關注的是授權,即:“用戶能做什么”;而OpenID關注的是證明,即:“用戶是誰”。
如果混淆了OAuth和OpenID的含義,后果很嚴重。以國內某網站開發的應用為例:它的功能是通過OAuth授權讓新浪微博和豆瓣的用戶使用各自的身份發表評論,如下圖所示:
此類應用屬於身份證明問題,本應該通過OpenID來實現,但因為錯誤的使用了OAuth,從而帶來安全隱患:設想一下用戶只是在網站上發表了評論而已,但卻賦予了網站隨意操作自己私有數據的權利!
客戶端的授權模式
客戶端必須得到用戶的授權(authorization grant),才能獲得令牌(access token)。OAuth 2.0定義了四種授權方式。
- 授權碼模式(authorization code)
- 簡化模式(implicit)
- 密碼模式(resource owner password credentials)
- 客戶端模式(client credentials)
說明:
簽名的意義在於防止請求被篡改。如果沒有簽名,只是簡單的使用Consumer Key和Consumer Secret,那和HTTP Basic還有什么區別?!實際使用OAuth的時候,請求中是不包含Consumer Secret的,它只是參與簽名的計算,所以,就算請求被別有用心的人截獲也是沒用的,因為他不知道Consumer Secret,所以算不出正確的簽名,也就無法構造出合法的請求。
3-Legged OAuth就是通過User的授權,Consumer可以訪問User在Service Provider的數據;至於2-Legged OAuth,沒有User的參與,只是Consumer和Service Provider的交互。
摘自:http://huoding.com/page/2,本文只是為了方便溫習.


