認證和授權(Authentication和Authorization)


什么是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流程通常如下圖所示:

OAuth流程圖

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授權讓新浪微博和豆瓣的用戶使用各自的身份發表評論,如下圖所示:

錯誤的把OAuth當做OpenID使用

錯誤的把OAuth當做OpenID使用

此類應用屬於身份證明問題,本應該通過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,本文只是為了方便溫習.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM