碰巧遇到OAuth,在網上學了一學,在此記錄以備忘。html
看了不少介紹文章,最後仍是以爲RFC最能讓你理解具體這個協議是怎麼工做了,在此把RFC5849的1.2節翻譯一下。安全
RFC5849服務器
1.2 例子app
Jane (resource owner) 已經上傳了一些她的假期照片(protected resources) 到她的照片分享網站'photos.example.net' (server). 她但願用 'printer.example.com' 網站(client) 來打印其中一張照片.和一般同樣,Jane用她的用戶名和密碼登陸到 'photos.example.net' .
但Jane不想告訴'printer.example.com'她的用戶名和密碼,而爲了打印而這個網站須要訪問照片。爲了給用戶提供更好的服務,'printer.example.com' 已經事先取得了一組'photos.example.net'的客戶端資格(client credentials): 客戶端識別號碼(Client Identifier):
dpf43f3p2l4k3l03 客戶端共享密文(Client Shared-Secret): kd94hf93k423kf4 'printer.example.com' 網站也設置好了它的程序以便利用列舉在 'photos.example.net' 的API文檔裏的協議終端接口,這些終端使用"HMAC-SHA1"簽名方法:
臨時資格請求 https://photos.example.net/initiate 資源主受權 URI:
https://photos.example.net/authorize Token請求URI:
https://photos.example.net/token 在'printer.example.com'能請求Jane受權它訪問照片以前,它必須同'photos.example.net'創建一組臨時資格以用來識別代理請求。 爲了實現這個,客服端送出一下HTTPS [RFC2818] 請求到服務器端: POST /initiate HTTP/1.1 Host: photos.example.net Authorization: OAuth realm="Photos", oauth_consumer_key="dpf43f3p2l4k3l03", oauth_signature_method="HMAC-SHA1", oauth_timestamp="137131200", oauth_nonce="wIjqoS", oauth_callback="http%3A%2F%2Fprinter.example.com%2Fready", oauth_signature="74KNZJeDHnMBp0EMJ9ZHt%2FXKycU%3D" 服務器端驗證這個請求並在HTTP應答的正文裏面回覆一組臨時資格(改行只是爲了顯示方便):
HTTP/1.1 200 OK Content-Type: application/x-www-form-urlencoded oauth_token=hh5s93j4hdidpola&oauth_token_secret=hdhd0244k9j7ao03& oauth_callback_confirmed=true 客戶端轉送Jane的user-agent到服務器的資源主受權端口以得到對於訪問私有照片的Jane的批准: https://photos.example.net/authorize?oauth_token=hh5s93j4hdidpola 服務器請求Jane用她的用戶名和密碼登陸,若是登陸成功,服務器再要求她批准受權 'printer.example.com' 訪問她私有的照片。Jane 批准這個請求而後她的user-agent就被轉送到客服端在之前的請求裏提供的callback URI: (改行只是爲了顯示方便):
http://printer.example.com/ready? oauth_token=hh5s93j4hdidpola&oauth_verifier=hfdp7dh39dks988 這個callback請求通知客戶端Jane完成了受權處理。而後客戶端用它的臨時資格來要求另外一組token資格(在一個安全的Transport Layer Security (TLS) 通道上): POST /token HTTP/1.1 Host: photos.example.net Authorization: OAuth realm="Photos", oauth_consumer_key="dpf43f3p2l4k3l03", oauth_token="hh5s93j4hdidpola", oauth_signature_method="HMAC-SHA1", oauth_timestamp="137131201", oauth_nonce="walatlh", oauth_verifier="hfdp7dh39dks9884", oauth_signature="gKgrFCywp7rO0OXSjdot%2FIHF7IU%3D" 服務器驗證這個請求並在HTTP應答的正文裏面回覆一組token資格:
HTTP/1.1 200 OK Content-Type: application/x-www-form-urlencoded oauth_token=nnch734d00sl2jdk&oauth_token_secret=pfkkdhi9sl3r4s00
有了這組token資格,客戶端作好了訪問私有照片的準備:
GET /photos?file=vacation.jpg&size=original HTTP/1.1 Host: photos.example.net Authorization: OAuth realm="Photos", oauth_consumer_key="dpf43f3p2l4k3l03", oauth_token="nnch734d00sl2jdk", oauth_signature_method="HMAC-SHA1", oauth_timestamp="137131202", oauth_nonce="chapoH", oauth_signature="MdpQcU8iPSUjWoN%2FUDMsK2sui9I%3D" 'photos.example.net'服務器驗證這個請求並回覆被請求訪問的照片.在Jane的受權的存活期間,'printer.example.com'可以用同一個token資格 繼續訪問Jane的私有照片, 或者直到Jane讓訪問無效.
參考資料網站
http://tools.ietf.org/html/rfc5849ui
這裏能看到一個很直觀的user experience分析圖url
http://hueniverse.com/oauth/.net
論述OAuth1.0a, WRAP( ) 以及 OAuth2.0的文章翻譯
http://radar.oreilly.com/2010/01/whats-going-on-with-oauth.html代理