OAuth授权验证说明
OAuth授權驗證說明
1.1. OAuth介紹
OAuth (開放授權) 是一個開放標準,允許用戶授權第三方網站訪問他們存儲在另外的服務提供者上的信息,而不需要將用戶名和密碼提供給第三方網站或分享他們數據的所有內容。為了保護凡客用戶的數據,所有第三方應用都需要通過OAuth認證機制來獲得用戶的授權。本文檔提供了凡客開放平臺OAuth認證的相關信息。
凡客開放平臺API采用OAuth協議為第三方提供接入服務,有關OAuth認證的詳細說明,請閱讀官方OAuth規范。
-OAuth標準(英文) http://oauth.net/
-OAuth維基百科(中文) http://zh.wikipedia.org/zh/OAuth
凡客開放平臺API使用OAuth 1.0a版本。
Web應用、桌面應用和手機應用如何通過凡客開放平臺服務器認證這一過程就是OAuth協議的主要內容。這一過程中可以抽象出三個角色:Server(Service Provider),Client(Consumer), User(Resource Owner)。在凡客開放平臺中,這三個的角色(實例化后)是: 凡客開放平臺服務端,第三方應用,凡客用戶。
1.2. 使用說明
為了使用凡客開放平臺提供的API(應用程序接口),我們會給每一個應用一個專屬的oauth_consumer_key和oauth_consumer_ Secret。
OAuth的登錄認證流程及訪問資源流程
OAuth的注冊認證流程及訪問資源流程
OAuth定義的認證過程分三步:
1. Client從server獲取未授權的RequestToken
2. User授權Client獲取的RequestToken,client獲取oauth_verifier (授權碼)
3. Client以RequestToken和oauth_verifier從server獲取AccessToken,AccessTokenSecret,UserId,UserToken 在此過程中RequestToken是一個臨時性的東西。完成這三步后,RequestToken就失去價值了。另外RequestToken在一段時間內沒有使用,也會過期從而失效。而AccessToken是一個持久性的東西,它是user對client的授權憑證,會一直有效。Client只需要保存UserId,AccessToken(即oauth_token),AccessTokenSecret(即oauth_token_secret),其中UserId,AccessToken兩個參數是訪問需要用戶登錄授權API所需要傳入的參數值,而AccessTokenSecret是訪問需要用戶登錄授權API簽名時需要的值。
4、使用UserId,AccessToken訪問或修改受保護,需要用戶登錄授權的API。
認證過程中第一步和第三步發送的請求是需要簽名的。
請求簽名說明
所有請求和受保護的資源請求必須被簽名。簽名算法使用Signature Base String和密鑰(Secret)生成簽名。
說明
Signature Base String由以下三部分組成,各項之間使用&符號分隔。
1、Http Method
請求方法,GET/POST
2、URL Encode之后的請求URL(URL要小寫)
例如:
請求URL:http://oapi.vancl.com/oauthnew/request-token.ashx
經URL Encode之后的請求URL為:
http%3A%2F%2F oapi.vancl.com%2Foauthnew%2Frequest-token.ashx
3、URL Encode并排序之后的請求參數
例如: URL請求參數為:
oauth_callback=http%3A%2F%2Flocalhost%3A60001%2FDemoWeb%2Fdemo.aspx&oauth_consumer_key=de47ea4337b847e09a9489b43373c845&oauth_nonce=3c7fa628eb92441c8e8a2f8147a72193&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1321580558&oauth_version=1.0
經URL Encode并排序(如果參數名有重復則再按參數值進行重復項目排序)之后的請求參數格式如下(使用%3D替代=號,參數間使用%26(即&符號)分隔):
oauth_callback%3Dhttp%253A%252F%252Flocalhost%253A60001%252FDemoWeb%252Fdemo.aspx%26oauth_consumer_key%3Dde47ea4337b847e09a9489b43373c845%26oauth_nonce%3D3c7fa628eb92441c8e8a2f8147a72193%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1321580558%26oauth_version%3D1.0
三部分拼接后即為Signature Base String的值,如下:
GET&http%3A%2F%2Foapi.vancl.com%2Foauthnew%2Frequest-token.ashx&oauth_callback%3Dhttp%253A%252F%252Flocalhost%253A60001%252FDemoWeb%252Fdemo.aspx%26oauth_consumer_key%3Dde47ea4337b847e09a9489b43373c845%26oauth_nonce%3D3c7fa628eb92441c8e8a2f8147a72193%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1321580558%26oauth_version%3D1.0
密鑰由oauth_consumer_secret和Request Token Secret組成(中間使用&符號分隔)。
第一步簽名密鑰為:oauth_consumer_secret;
第三步簽名密鑰為:oauth_consumer_secret &Request Token Secret;
1.3. OAuth認證流程簡介
1.3.1. 獲取未授權的request token
獲取request token是進行用戶認證的第一步。這一步主要有兩個目的:
第一,告訴凡客開放平臺你將要做什么
第二,告訴凡客開放平臺你在callback里要做什么
app發送HTTP GET請求到http://oapi.vancl.com/oauthnew/request-token.ashx獲取request_token 此時,app所擁有的信息只有: oauth_consumer_key和oauth_consumer_secret。oauth_consumer_key是app的唯一標識。要想去凡客開放平臺服務器請求token,必須告訴它是誰在請求,所以這個參數必須傳遞給服務器。oauth_consumer_secret是凡客開放平臺為每個app分配的用以進行機密數據交換的密鑰。(這是一個保密項,不要公開否則別人可能會冒你的名去發送請求),oauth_consumer_secret主要用來進行數據簽名。
請求參數
| 參數 | 意義 |
| oauth_consumer_key | 凡客開放平臺分配的應用的唯一KEY標記 |
| oauth_signature_method | 簽名方法, HMAC-SHA1 (固定) |
| oauth_signature | 簽名值,密鑰為:oauth_consumer_secret。計算說明。 |
| oauth_timestamp | 時間戳, 其值是距1970 00:00:00 GMT的秒數,必須是大于0的整數 |
| oauth_nonce | 單次值,隨機生成的32位字符串,防止重放攻擊(每次請求必須不同) |
| oauth_callback | 認證成功后瀏覽器會被重定向到這個url中 |
| oauth_version | 版本號, “1.0” (固定) |
返回參數
| 參數 | 意義 |
| oauth_token | 未授權的Request Token |
| oauth_token_secret | 對應的Request Token Secret |
| oauth_callback_confirmed | 對oauth_callback的確認信號, 為true表示回調地址生效 |
說明:
用戶授權后web應用將會重定向到oauth_callback,此url必須以http://開頭。
時間戳與標準時間偏差不得大于8分鐘。
假如有一款應用:
oauth_consumer_key = “873786fd712936a3a1f3cc9b8b1a6b94”
oauth_consumer_secret = “3a58dd9023cf1adec08f0656acc5bf95”
示例
請求參數:
返回參數
| 參數名稱 | 參數值 |
| oauth_consumer_key | 873786fd712936a3a1f3cc9b8b1a6b94 |
| oauth_signature | oauth_signature為"7M1b9CG32KsclajAVXrHzPdE238="URI編碼后為"7M1b9CG32KsclajAVXrHzPdE238%3d |
| oauth_nonce | 774d4d2fb95a49628bbd109a79139117 |
| oauth_timestamp | 1321582909 |
| oauth_signature_method | HMAC-SHA1 |
| oauth_version | 1.0 |
| oauth_callback | http%3A%2F%2Flocalhost%3A60001%2FDemoWeb%2Fdemo.aspx |
Base string的生成
| Base String | GET&http%3A%2F%2Foapi.vancl.com%2Foauthnew%2Frequest-token.ashx&oauth_callback%3Dhttp%253A%252F%252Flocalhost%253A60001%252FDemoWeb%252Fdemo.aspx%26oauth_consumer_key%3D873786fd712936a3a1f3cc9b8b1a6b94%26oauth_nonce%3D774d4d2fb95a49628bbd109a79139117%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1321582909%26oauth_version%3D1.0 |
使用signing key(oauth_consumer_secret后加一個&符)生成oauth_signature:
| signature | 7M1b9CG32KsclajAVXrHzPdE238%3d |
返回結果
| 參數名稱 | 參數值 |
| oauth_token | 1a6b213f81ef48b4b94524c2cfff50d0 |
| oauth_token_secret | 2c52bae787544992b20f21e01635ab67 |
| oauth_callback_confirmed | true |
請求格式如下:
http://oapi.vancl.com/oauthnew/request-token.ashx?oauth_callback=http%3A%2F%2Flocalhost%3A60001%2FDemoWeb%2Fdemo.aspx&oauth_consumer_key=873786fd712936a3a1f3cc9b8b1a6b94&oauth_nonce=774d4d2fb95a49628bbd109a79139117&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1321582909&oauth_version=1.0&oauth_signature=7M1b9CG32KsclajAVXrHzPdE238%3d
當服務器端接到請求之后,會返回包含oauth_token,oauth_token_secret,oauth_callback_confirmed等內容,另外oauth_callback_confirmed字段如果為true就表示callback生效。
服務器端的響應如下:
oauth_token=1a6b213f81ef48b4b94524c2cfff50d0&oauth_token_secret=2c52bae787544992b20f21e01635ab67&oauth_callback_confirmed=true
此時返回的oauth_token即為RequestToken, oauth_token_secret即為RequestTokenSecret。這時需要將oauth_token和oauth_token_secret記下,我們需要用這個參數來獲取access token。
1.3.2. 用戶授權認證
app發送HTTP GET請求到http://oapi.vancl.com/oauthnew/authorize.aspx獲取授權碼(oauth_verifier)。(說明:如果是注冊,則請求地址為http://oapi.vancl.com/oauthnew/UserRegister.aspx,其他與oauth登錄認證方式完全一樣)要求必須以oauth_token作為參數,一般來說請求格式如下:
http://oapi.vancl.com/oauthnew/authorize.aspx?oauth_token=1a6b213f81ef48b4b94524c2cfff50d0
請求參數:
| 參數名稱 | 說明 |
| oauth_token | 上一步中獲得的未授權的Request Token |
返回參數:
| 參數名稱 | 說明 |
| oauth_token | 用戶授權之后的Token值, 與未授權Token值相同 |
| oauth_verifier | 簽名值,方便第三方來驗證來源的可靠性 |
示例
請求參數:
| 參數名稱 | 說明 |
| oauth_token | 1a6b213f81ef48b4b94524c2cfff50d0 |
返回結果:
| 參數名稱 | 說明 |
| oauth_token | 1a6b213f81ef48b4b94524c2cfff50d0 |
| oauth_verifier | NlbRvOzRqxWzarCpdq8xgA== |
說明:
①此頁面中會要求用戶登陸凡客,然后選擇同意或者拒絕對應用授權。
②授權成功后:
web應用會重定向到oauth_callback所指定的URL(其中包含oauth_token和oauth_verifier)。 客戶端應用(oauth_callback=null)會在網頁中給出授權碼,用戶需要手工將驗證碼輸入到應用中才能完成授權流程。
oauth_callback用來登錄成功后,回調到第三方應用的頁面。回調后, oauth_callback應該已經接到返回的信息,其中包含oauth_token和oauth_verifier。樣例如下: oauth_token=1a6b213f81ef48b4b94524c2cfff50d0&oauth_verifier=NlbRvOzRqxWzarCpdq8xgA==
1.3.3. 獲取access token
app發送HTTP GET請求到http://oapi.vancl.com/oauthnew/access-token.ashx獲取access_token
請求參數:
| 參數 | 說明 |
| oauth_consumer_key | 應用的唯一KEY標記 |
| oauth_token | 第一步中獲得的Request Token |
| oauth_signature_method | 簽名方法,暫只支持HMAC-SHA1 |
| oauth_signature | 簽名值,密鑰為:oauth_consumer_secret &Request Token Secret。 |
| oauth_timestamp | 時間戳, 其值是距1970 00:00:00 GMT的秒數,必須是大于0的整數 |
| oauth_nonce | 單次值,隨機生成的32位字符串,防止重放攻擊(每次請求必須不同) |
| oauth_verifier | 上一步請求授權request token時返回的授權碼 |
| oauth_version | 版本號,必須為“1.0” |
返回參數:
| 參數 | 說明 |
| oauth_token | 具有訪問權限的token(Access token) |
| oauth_token_secret | Access token的密鑰 |
| user_id | 用戶ID |
| UserToken | 用戶token |
示例
請求參數:
| 參數 | 參數值 |
| oauth_consumer_key | 873786fd712936a3a1f3cc9b8b1a6b94 |
| oauth_token | 1a6b213f81ef48b4b94524c2cfff50d0 |
| oauth_signature | BhZMohRRgjFrWBRi6qL993XuGXQ%3d |
| oauth_nonce | 9ae3a3b8051b466c85c8d0107c8423c3 |
| oauth_timestamp | 1321584266 |
| oauth_signature_method | HMAC-SHA1 |
| oauth_version | 1.0 |
| oauth_verifier | NlbRvOzRqxWzarCpdq8xgA== |
Base string的生成
| Base String | GET&http%3A%2F%2Foapi.vancl.com%2Foauthnew%2Faccess-token.ashx&oauth_consumer_key%3D873786fd712936a3a1f3cc9b8b1a6b94%26oauth_nonce%3D9ae3a3b8051b466c85c8d0107c8423c3%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1321584266%26oauth_token%3D1a6b213f81ef48b4b94524c2cfff50d0%26oauth_verifier%3DNLBRVOZRQXWZARCPDQ8XGA%253D%253D%26oauth_version%3D1.0 |
使用signing key(Consumer Secret和Request Token Secret中間使用&分隔)生成oauth_signature:
| signing key | 3a58dd9023cf1adec08f0656acc5bf95&2c52bae787544992b20f21e01635ab67 |
| signature | BhZMohRRgjFrWBRi6qL993XuGXQ%3d |
返回結果
| 參數名稱 | 參數值 |
| oauth_token | 22d9af8dadd445128b2f7e4c3092470c |
| oauth_token_secret | a01f08a98c734e4488a5b8b6c8a42d20 |
| user_id | 31347780 |
| UserToken | e8f45c004264e721adbb78bc369cbdbb |
請求格式為:
http://oapi.vancl.com/oauthnew/access-token.ashx?oauth_consumer_key=873786fd712936a3a1f3cc9b8b1a6b94&oauth_nonce=9ae3a3b8051b466c85c8d0107c8423c3&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1321584266&oauth_token=1a6b213f81ef48b4b94524c2cfff50d0&oauth_verifier=NLBRVOZRQXWZARCPDQ8XGA%3D%3D&oauth_version=1.0&oauth_signature=BhZMohRRgjFrWBRi6qL993XuGXQ%3d
凡客開放平臺會返回應用需要的信息,包括 UserId,UserToken,oauth_token,oauth_token_secret(當然這里就是AccessToken與AccessTokenSecret了)。 response內容如下:
oauth_token=22d9af8dadd445128b2f7e4c3092470c&oauth_token_secret=a01f08a98c734e4488a5b8b6c8a42d20&user_id=31347780& UserToken=e8f45c004264e721adbb78bc369cbdbb
現在就可以使用UserId,oauth_token,oauth_token_secret來訪問服務端API啦。
iOS Android Appcan WeChat
總結
以上是生活随笔為你收集整理的OAuth授权验证说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转载】Linux系统调用SYSCALL
- 下一篇: Chapter 5 Blood Type