OAuth認證協(xié)議原理分析及使用方法
twitter或豆瓣用戶一定會發(fā)現(xiàn),有時候,在別的網(wǎng)站,點登錄后轉(zhuǎn)到 twitter登錄,之后轉(zhuǎn)回原網(wǎng)站,你會發(fā)現(xiàn)你已經(jīng)登錄此網(wǎng)站了,比如像 feedtwitterrss2twitter推特中文圈(這個目前好像有點問題轉(zhuǎn)回來的時候是個錯誤地址) 這種 網(wǎng)站就是這個效果。其實這都是拜 OAuth所賜。
OAuth是什么?
OAuth是一個開放的認證協(xié) 議,讓你可以在Web或桌面程序中使用簡單而標準的,安全的API認證。
OAuth有什么用?為什么要使用OAuth?
網(wǎng) 絡(luò)開放是一個不變的趨勢,那么不可避免的會有各種網(wǎng)絡(luò)服務(wù)間分享內(nèi)容的需要。
舉個我們身邊國內(nèi)的例子吧:比如人人網(wǎng)想要調(diào)用QQ郵箱的聯(lián)系 人列表,現(xiàn)在的方法是你需要在人人網(wǎng)輸入你的QQ號,QQ密碼才能調(diào)用,雖然網(wǎng)站上可能都自謂“不保留QQ用戶名密碼”,但是大家信嗎?
OAuth 就是為了解決這個問題而誕生的,用戶訪問第三方資源,不再需要網(wǎng)站提交你的用戶名,密碼。這樣好處自己是安全,而且不會泄露你的隱私給不信任的一方。
OAuth 原理
OAuth中有三方:一,用戶;二,Consumer(不知雜翻譯,類似上面的 twitterfeed 角色);三,服務(wù)提供商(如上例的twitter角色)。
一,Consumer 向 服務(wù)提供商 申請接入權(quán)限
可 得到:Consumer Key,Consumer Secret。twitter申請oauth的話,在 setting - connection - developer 里面申請。 同時給出三個訪問網(wǎng)址:
- request_token_url = 'http://twitter.com/oauth/request_token'
- access_token_url = 'http://twitter.com/oauth/access_token'
- authorize_url = 'http://twitter.com/oauth/authorize'
二,當Consumer接到用戶請求想要訪問第三方資源(如twitter)的時候
Consumer需要先取 得 請求另牌(Request Token)。網(wǎng)址為上面的 request_token_url,參數(shù)為:
- oauth_consumer_key:Consumer Key
- oauth_signature_method:簽名加密方法
- oauth_signature:加密的簽名 (這個下面細說)
- oauth_timestamp:UNIX時間戳
- oauth_nonce:一個隨機的混淆字符串,隨機生成一個。
- oauth_version:OAuth版本,可選,如果設(shè)置的話,一定設(shè)置為 1.0
- oauth_callback:返回網(wǎng)址鏈接。
- 及其它服務(wù)提供商定義的參數(shù)
這樣 Consumer就取得了 請求另牌(包括另牌名 oauth_token,另牌密鑰 oauth_token_secret。
三,瀏覽器自動轉(zhuǎn)向服務(wù)提供商的網(wǎng)站:
網(wǎng)址 為 authorize_url?oauth_token=請求另牌名
四,用戶同意 Consumer訪問 服務(wù)提供商資源
那 么會自動轉(zhuǎn)回上面的 oauth_callback 里定義的網(wǎng)址。同時加上 oauth_token (就是請求另牌),及 oauth_verifier(驗證碼)。
五,現(xiàn)在總可以開始請求資源了吧?
NO。 現(xiàn)在還需要再向 服務(wù)提供商 請求 訪問另牌(Access Token)。網(wǎng)址為上面的 access_token_url,參數(shù)為:
- oauth_consumer_key:Consumer Key
- oauth_token:上面取得的 請求另牌的名
- oauth_signature_method:簽名加密方法
- oauth_signature:加密的簽名 (這個下面細說)
- oauth_timestamp:UNIX時間戳
- oauth_nonce:一個隨機的混淆字符串,隨機生成一個。
- oauth_version:OAuth版本,可選,如果設(shè)置的話,一定設(shè)置為 1.0
- oauth_verifier:上面返回的驗證碼。
- 請求 訪問另牌的時候,不能加其它參數(shù)。
這樣就可以取得 訪問另牌(包括Access Token 及 Access Token Secret)。這個就是需要保存在 Consumer上面的信息(沒有你的真實用戶名,密碼,安全吧!)
六,取得 訪問另牌 后,
Consumer 就可以作為用戶的身份訪問 服務(wù)提供商上被保護的資源了。提交的參數(shù)如下:
- oauth_consumer_key:Consumer Key
- oauth_token:訪問另牌
- oauth_signature_method:簽名加密方法
- oauth_signature:加密的簽名 (這個下面細說)
- oauth_timestamp:UNIX時間戳
- oauth_nonce:一個隨機的混淆字符串,隨機生成一個。
- oauth_version:OAuth版本,可選,如果設(shè)置的話,一定設(shè)置為 1.0
- 及其它服務(wù)提供商定義的參數(shù)
OAuth安全機制是如何實現(xiàn)的?
OAuth 使用的簽名加密方法有 HMAC-SHA1,RSA-SHA1 (可以自定義)。拿 HMAC-SHA1 來說吧,HMAC-SHA1這種加密碼方法,可以使用 私鑰 來加密 要在網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù),而這個私鑰只有 Consumer及服務(wù)提供商知道,試圖攻擊的人即使得到傳輸在網(wǎng)絡(luò)上的字符串,沒有 私鑰 也是白搭。
私 鑰是:consumer secret&token secret (哈兩個密碼加一起)
要加密的字符串是: 除 oauth_signature 外的其它要傳輸?shù)臄?shù)據(jù)。按參數(shù)名字符排列,如果一樣,則按 內(nèi)容排。如:domain=kejibo.com&oauth_consumer_key=XYZ& word=welcome......................
前面提的加密里面都是固定的字符串,那么攻擊者豈不是直接可以偷取 使用嗎?
不,oauth_timestamp,oauth_nonce。這兩個是變化的。而且服務(wù)器會驗證一個 nonce(混淆碼)是否已經(jīng)被使用。
那么這樣攻擊者就無法自已生成 簽名,或者偷你的簽名來使用了。
來源:http://kejibo.com/oauth/

浙公網(wǎng)安備 33010602011771號