騰訊微博Android客戶端開發 - OAuth1.0認證介紹

http://wiki.open.t.qq.com/index.php/OAuth%E6%8E%88%E6%9D%83%E8%AF%B4%E6%98%8E


目錄

騰訊微博 API OAuth認證介紹

騰訊微博開放平臺,是基於騰訊微博系統,爲廣大開發者和用戶提供的開放數據分享與傳播平臺。 php

廣大開發者和用戶登陸平臺後,就能夠使用平臺提供的開放API接口,建立應用從微博系統獲取信息,或將新的信息傳播到整個微博系統中,豐富多樣的API接口和應用,加上您的智慧,將創造出無窮的應用和樂趣。 git

騰訊微博API採用OAuth協議爲第三方提供接入服務,遵循[RFC-5849]規範。有關OAuth認證的詳細說明,請閱讀官方OAuth規範。各類語言的OAuth 客戶端能夠在Google-OAuth項目裏找到。 程序員

騰訊微博API使用OAuth 1.0a版本。 web

OAuth官網地址:http://www.oauth.net/ 算法

OAuth是什麼?

OAuth協議爲用戶資源的受權提供了一個安全的、開放而又簡易的標準。同時,任何第三方均可以使用OAuth認證服務,任何服務提供商均可以實現 自身的OAuth認證服務,於是OAuth是開放的。業界提供了OAuth的多種實現如PHP,JavaScript,Java,Ruby等各類語言開發 包,大大節約了程序員的時間,於是OAuth是簡易的。目前互聯網不少服務如Open API,不少大頭公司如Google,Yahoo,Microsoft等都提供了OAuth認證服務,這些都足以說明OAuth標準逐漸成爲開放資源受權 的標準。 json

在官方網站的首頁,能夠看到下面這段簡介: api

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、 Facebook Auth等。 瀏覽器

OAuth認證受權具備如下特色: 安全

  1. 簡單:無論是OAuth服務提供者仍是應用開發者,都很容易於理解與使用;
  2. 安全:沒有涉及到用戶密鑰等信息,更安全更靈活;
  3. 開放:任何服務提供商均可以實現OAuth,任何軟件開發商均可以使用OAuth; 

OAuth的原理認證流程及訪問資源流程

resource1.png

騰訊微博API經過如下四個步驟來完成認證受權並訪問或修改受限資源的流程 app

  1. 獲取未受權的Request Token(temporary credentials)
  2. 請求用戶受權Request Token
  3. 使用受權後的Request Token換取Access Token(token credentials)
  4. 使用 Access Token 訪問或修改受保護資源

其中1~3步使用httpshttp方式, 第4步使用http方式。

用戶修改密碼或進行非法行爲會致使受權失效,此時須要從新進行受權

請求籤名說明

全部TOKEN請求和受保護的資源請求必須被簽名,微博開放平臺會根據簽名來判斷請求的合法性。簽名算法使用Signature Base String和密鑰(Secret)生成簽名,參數oauth_signature用於指定簽名。

resource2.gif

說明:

Signature Base String由如下三部分組成,各項之間使用&符號分隔。

一、Http Method
請求方法,GET/POST

二、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

三、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

http://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的確認信號

說明:

  1. 用戶受權後web應用將會重定向到oauth_callback。當應用爲pc客戶端或手機客戶端應用時,沒有回調url(oauth_callback)的概念,此時設置爲字符串null便可。字符串「null」必須是小寫
  2. 時間戳與標準時間誤差不得大於8分鐘。
示例:

request_token

http://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:

http://open.t.qq.com/cgi-bin/authorize

請求參數:

參數 意義
oauth_token 上一步中得到的未受權的Request Token
wap
(可選參數)
主要用於指定手機受權頁的版本
wap=1時,跳轉到wap1.0的受權頁
wap=2時,跳轉到wap2.0的受權頁
不帶本參數時,手機訪問默認跳到wap2.0的受權頁

返回參數:

參數 意義
oauth_token 用戶受權以後的Token值,與未受權Token值相同。
oauth_verifier 驗證碼
openid 能夠惟一標識一個用戶(wap=1或wap=2時不返回該參數)
openkey 與openid對應的用戶key,是驗證openid身份的驗證密鑰(wap=1或wap=2時不返回該參數)

說明:

  1. 此頁面中會要求用戶登錄,而後選擇贊成或者拒絕對應用受權。
  2. 受權成功後:
# web應用會重定向到oauth_callback所指定的URL(含返回參數)。 
# 客戶端應用(oauth_callback=null)會在網頁中給出受權碼,用戶須要手工將驗證碼輸入到應用中才能完成受權流程。

示例:

參數 意義
oauth_token hdk48Djdsa
oauth_verifier 473f82d3
openid 2D4263AB08EE337C3F3F26106BF881DA
openkey 543403C5AA99BDCB6F87DFBB14240E04
oauth_token=hdk48Djdsa&oauth_verifier=473f82d3

使用受權後的Request Token換取Access Token

用戶完成受權後,第三方應用能夠經過訪問以下url,將已受權的Request Token換取Access Token。Access Token將被用於訪問或修改受限資源。

http://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_secrete Access Token Secret

說明:

  1. 本步驟用於簽名的密鑰爲App Secret和Request Token Secret(中間使用&分隔)
  2. 得到返回值後就能夠使用Access Token來訪問資源了。
  3. Access Token和Access Token Secret永遠不會過時,直到用戶撤銷應用受權或騰訊回收您的app訪問權限纔會失效。

用於簽名的Signature Base String格式以下:

示例:access_token:

http://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 nnch734d00ls2jdk
oauth_token_secrete
pdkkdhi9sl3r4s00

至此,您的應用就取得了用戶的受權,請妥善保管得到的Access Token和Access Token Secret。

此後,您的應用就能夠使用該Access Token訪問騰訊微博了。

使用包含Access Token的OAuth標準參數訪問騰訊微博

得到Access Token以後,您的應用就能夠使用該Access Token訪問騰訊微博。

在每次調用接口API時,請求都必須包含以下所示OAuth標準參數:

參數 意義
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 helloworld
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=helloworld&clientip=121.14.96.121&longitude=113.421234&latitude=22.354231&syncflag=0&format=xml&oauth_token=d8b0965f24a14575a84863a5e19a8705&oauth_nonce=709da91378181caec8e709085a757764&oauth_consumer_key=801058005&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_timestamp=1350653166&oauth_signature=unC%2FaR5N6hoXUsrabBgKHYjKcdg%3D
相關文章
相關標籤/搜索