騰訊微博Android客戶端開發 - OAuth認證介紹
騰訊微博 API OAuth認證介紹
騰訊微博開放平臺,是基于騰訊微博系統,為廣大開發者和用戶提供的開放數據分享與傳播平臺。
廣大開發者和用戶登錄平臺后,就可以使用平臺提供的開放API接口,創建應用從微博系統獲取信息,或將新的信息傳播到整個微博系統中,豐富多樣的API接口和應用,加上您的智慧,將創造出無窮的應用和樂趣。
騰訊微博API采用OAuth協議為第三方提供接入服務,遵循[RFC-5849]規范。有關OAuth認證的詳細說明,請閱讀官方OAuth規范。各種語言的OAuth 客戶端可以在Google-OAuth項目里找到。
騰訊微博API使用OAuth 1.0a版本。
OAuth官網地址:http://www.oauth.net/
OAuth是什么?
OAuth協議為用戶資源的授權提供了一個安全的、開放而又簡易的標準。同時,任何第三方都可以使用OAuth認證服務,任何服務提供商都可以實現自身的 OAuth認證服務,因而OAuth是開放的。業界提供了OAuth的多種實現如PHP,JavaScript,Java,Ruby等各種語言開發包,大大節約了程序員的時間,因而OAuth是簡易的。目前互聯網很多服務如Open API,很多大頭公司如Google,Yahoo,Microsoft等都提供了OAuth認證服務,這些都足以說明OAuth標準逐漸成為開放資源授權的標準。
在項目主頁的首頁,可以看到下面這段簡介:
An open protocol to allow secure API authorization in a simple and standard method from desktop and web applications.
大概意思是說OAuth是一種開放的協議,為桌面程序或者基于BS的web應用提供了一種簡單的,標準的方式去訪問需要用戶授權的API服務。OAuth類似于Flickr Auth、Google's AuthSub[1]、Yahoo's BBAuth、 非死book Auth等。
OAuth認證授權具有以下特點:
- 1. 簡單:不管是OAuth服務提供者還是應用開發者,都很容易于理解與使用;
- 2. 安全:沒有涉及到用戶密鑰等信息,更安全更靈活;
- 3. 開放:任何服務提供商都可以實現OAuth,任何軟件開發商都可以使用OAuth;
OAuth的原理認證流程及訪問資源流程
騰訊微博API通過以下四個步驟來完成認證授權并訪問或修改受限資源的流程
- 1.獲取未授權的Request Token(temporary credentials)
- 2.請求用戶授權Request Token
- 3.使用授權后的Request Token換取Access Token(token credentials)
- 4.使用 Access Token 訪問或修改受保護資源
其中1~3步使用https方式, 第4步使用http方式。
請求簽名說明
所有TOKEN請求和受保護的資源請求必須被簽名,微博開放平臺會根據簽名來判斷請求的合法性。簽名算法使用Signature Base String和密鑰(Secret)生成簽名,參數oauth_signature用于指定簽名。
說明:
Signature Base String由以下三部分組成,各項之間使用&符號分隔。
1、Http Method
請求方法,GET/POST
2、URL Encode之后的請求URL(URL要小寫)
例如:
請求URL:https://open.t.qq.com/cgi-bin/request_token
經URL Encode之后的請求URL為:
https%3A%2F%2Fopen.t.qq.com%2Fcgi-bin%2Frequest_token
3、URL Encode并排序之后的請求參數
例如: URL請求參數為:
oauth_callback=www.qq.com&oauth_consumer_key=49b0bes7352943a1a5609f9e30346201&oauth_nonce=90523669&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1298513816&oauth_version=1.0
經URL Encode并排序之后的請求參數格式如下(參數間使用%26(即&符號)分隔):
oauth_callback%3Dwww.qq.com%26oauth_consumer_key%5D49b0bes7352943a1a5609f9e30346201%26oauth_nonce%3D90523669%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1298513816%26oauth_version%3D1.0
算法偽碼:
httpMethod + "&" + url_encode( base_uri ) + "&" + sorted_query_params.each { | k, v | url_encode ( k ) + "%3D" + url_encode ( v ) }.join("%26")
密鑰由App Secret和Token Secret組成(中間使用&符號分隔)
簽名算法目前只支持HMAC-SHA1。
獲取未授權的Request Token
通過訪問以下 URL 獲取未授權的 Request Token
https://open.t.qq.com/cgi-bin/request_token
請求參數
參數 | 意義 |
oauth_consumer_key | App Key(應用信息中的App Key值) |
oauth_signature_method | 簽名方法,暫只支持HMAC-SHA1 |
oauth_signature | 簽名值,密鑰為:App 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的確認信號 |
說明:
① 用戶授權后web應用將會重定向到oauth_callback。當應用為pc客戶端或手機客戶端應用時,沒有回調url(oauth_callback)的概念,此時設置為字符串null即可。字符串“null”必須是小寫。
② 時間戳與標準時間偏差不得大于8分鐘。
示例:
request_token
https://open.t.qq.com/cgi-bin/request_token?oauth_callback=null&oauth_consumer_key=aca77d2eb96f46e1b3353bc6743e8bfc&oauth_nonce=yQDMuXvdcEfQs2Mzf3XcT1r36WTULJls&oauth_signature=exxzU/tTbpdicmYHcyYh5kqgYgo=&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1299569145&oauth_version=1.0
參數名 | 參數值 |
oauth_consumer_key | aca77d2eb96f46e1b3353bc6743e8bfc |
oauth_signature_method | HMAC-SHA1 |
oauth_signature | exxzU/tTbpdicmYHcyYh5kqgYgo= |
oauth_timestamp | 1299569145 |
oauth_nonce | yQDMuXvdcEfQs2Mzf3XcT1r36WTULJls |
oauth_callback | null |
oauth_version | 1.0 |
返回結果:
oauth_token=hdk48Djdsa&oauth_token_secret=xyz4992k83j47x0b&oauth_callback_confirmed=true
參數名 | 參數值 |
oauth_token | hdk48Djdsa |
oauth_token_secret | xyz4992k83j47x0b |
oauth_callback_confirmed | true |
請求用戶授權Request Token
此步驟的目的是請求用戶授權Request Token,請求URL:
https://open.t.qq.com/cgi-bin/authorize
請求參數:
參數 | 意義 |
oauth_token | 上一步中獲得的未授權的Request Token |
返回參數:
參數 | 意義 |
oauth_token | 用戶授權之后的Token值,與未授權Token值相同。 |
oauth_verifier | 驗證碼 |
說明:
①此頁面中會要求用戶登陸,然后選擇同意或者拒絕對應用授權。
②授權成功后:
- A: web應用會重定向到oauth_callback所指定的URL(含返回參數)。
- B: 客戶端應用(oauth_callback=null)會在網頁中給出授權碼,用戶需要手工將驗證碼輸入到應用中才能完成授權流程。
示例:
參數 | 意義 |
oauth_token | hdk48Djdsa |
oauth_verifier | 473f82d3 |
oauth_token=hdk48Djdsa&oauth_verifier=473f82d3
使用授權后的Request Token換取Access Token
用戶完成授權后,第三方應用可以通過訪問如下url,將已授權的Request Token換取Access Token。Access Token將被用于訪問或修改受限資源。
https://open.t.qq.com/cgi-bin/access_token
請求參數:
參數 | 意義 |
oauth_consumer_key | AppKey |
oauth_token | 第一步中獲得的Request Token |
oauth_signature_method | 簽名方法,暫只支持HMAC-SHA1 |
oauth_signature | 簽名值,密鑰為:App 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 | Access Token |
oauth_token_secreate | Access Token Secret |
說明:
- ①本步驟用于簽名的密鑰為App Secret和Request Token Secret(中間使用&分隔)
- ②獲得返回值后就可以使用Access Token來訪問資源了。
- ③Access Token和Access Token Secret永遠不會過期,直到用戶撤銷應用授權或騰訊回收您的app訪問權限才會失效。
用于簽名的Signature Base String格式如下:
示例:access_token:
https://open.t.qq.com/cgi-bin/access_token?oauth_consumer_key=aca77d2eb96f46e1b3353bc6743e8bfc&oauth_nonce=y2FrX7Muouma5vxWTKngEb7uHkRu4P5u&oauth_signature=209vcEaHkmb/QwHqsRU3HRPvlqw=&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1299569210&oauth_token=6b99583b7bc8446bb57e86128158994f&oauth_verifier=877973&oauth_version=1.0
參數 | 意義 |
oauth_consumer_key | aca77d2eb96f46e1b3353bc6743e8bfc |
oauth_token | 6b99583b7bc8446bb57e86128158994f |
oauth_signature_method | HMAC-SHA1 |
oauth_signature | 209vcEaHkmb/QwHqsRU3HRPvlqw= |
oauth_timestamp | 1299569210 |
oauth_nonce | y2FrX7Muouma5vxWTKngEb7uHkRu4P5u |
oauth_verifier | 877973 |
oauth_version(可選) | 1.0 |
返回結果:
oauth_token=nnch734d00ls2jdk&oauth_token_secreate=pdkkdhi9sl3r4s00
參數 | 意義 |
oauth_token | oauth_token_secreate |
nnch734d00ls2jdk | pdkkdhi9sl3r4s00 |
至此,您的應用就取得了用戶的授權,請妥善保管獲得的Access Token和Access Token Secret。
此后,您的應用就可以使用該Access Token訪問騰訊微博了。
使用Access Token訪問騰訊微博
獲得Access Token之后,您的應用就可以使用該Access Token訪問騰訊微博。
在每次調用接口API時,請求都必須包含以下參數:
參數 | 意義 |
oauth_consumer_key | AppKey |
oauth_token | Access Token |
oauth_signature_method | 簽名方法,暫只支持HMAC-SHA1 |
oauth_signature | 簽名值,密鑰為:App Secret&Access Token Secret。計算說明。 |
oauth_timestamp | 時間戳 |
oauth_nonce | 單次值 |
示例:
調用API:http://open.t.qq.com/api/t/add 發布一條微博:
參數包括:
1)接口參數:content和format;
2)OAuth協議參數
參數 | 參數值 |
content | %E6%9D%A5%E8%87%AA%23weibo_SDK%23%E7%9A%84%E6%B5%8B%E8%AF%95%E6%B6%88%E6%81%AF%EF%BC%81 |
format | json |
oauth_consumer_key | aca77d2eb96f46e1b3353bc6743e8bfc |
oauth_nonce | Tld5QvrtTlRJvaSWPlCC7DIXxnTBeumD |
oauth_signature | JuPSe7ibf0uPECp4HcX4Fu9y3l0= |
oauth_signature_method | HMAC-SHA1 |
oauth_timestamp | 1299569293 |
oauth_token | b8c8f1a888ea4f2887eac88787b6e895 |
oauth_version | 1.0 |
post:
http://open.t.qq.com/api/t/add?content=%E6%9D%A5%E8%87%AA%23weibo_SDK%23%E7%9A%84%E6%B5%8B%E8%AF%95%E6%B6%88%E6%81%AF%EF%BC%81&format=json&oauth_consumer_key=aca77d2eb96f46e1b3353bc6743e8bfc&oauth_nonce=Tld5QvrtTlRJvaSWPlCC7DIXxnTBeumD&oauth_signature=JuPSe7ibf0uPECp4HcX4Fu9y3l0=&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1299569293&oauth_token=b8c8f1a888ea4f2887eac88787b6e895&oauth_version=1.0