原文博客:http://www.cnblogs.com/hll2008/archive/2011/01/03/1924952.html
對於界面及數據庫使用就不在囉嗦,只詮釋下授權驗證部分。
新浪微博授權支持Oauth1.0 和Oauth2.0 ,後者對前者在過程中有所改變,詳細信息可參考:
Oauth1.0 http://open.weibo.com/wiki/Oauth
Oauth2.0 http://open.weibo.com/wiki/index.php?title=Oauth2&redirect=no
授權機制:
大部分REST API的訪問如發表微博,獲取私信都需要用戶身份。目前用戶身份鑑權有OAuth和Basic Auth(僅用於開發者調試接口)兩種方式。
OAuth
HTTP普通鑑權(Basic Authentication)方式
curl -u user:password -d "source=10001&status=api test" http://api.t.sina.com.cn/statuses/update.xml
oauth/request_token
- oauth_consumer_key: 創建應用時生成的APP KEY。
- oauth_signature_method: 簽名方法,建議使用“HMAC-SHA1”。
- oauth_timestamp:時間戳。生成Base String時的時間戳。
- oauth_nonce:單次值,一個隨機字符串,防止重複攻擊。該字段只支持ASCII碼的字符。
- oauth_version : OAuth協議版本。填寫“1.0”。
- oauth_signature:簽名值,是由根據上面的5個參數生成的 Base String經HMAC-SHA1算法計算得出。
httpMethod + "&" + url_encode( base_uri ) + "&" + sorted_query_params.each { | k, v | url_encode ( k ) + "=" + url_encode ( v ) }.join("&")
返回值
oauth_token=8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc&oauth_token_secret=x6qpRnlEmW9JbQn4PQVVeVG8Z
獲取request token
request token是進行用戶認證的第一步。這一步主要有兩個目的:consumer secret - "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" 這個做什麼用 ?第一步,用上文提到的算法形成BASE STRING。需要注意的是callback在URL中包含請求參數,由於參數只CALLBACK URL的一部分,所以並不需要將其提出成爲獨立的參數。 URL必須按照單個字符串來考慮。生成的BASE STRING如下:
oauth_callback - http://localhost:3005/the_dance/process_callback?service_provider_id=11 授權後的重定向的URL
oauth_consumer_key - GDdmIQH6jhtmLUypg82g 創建應用時生成的APP KEY。
oauth_nonce - QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk 單次值,一個隨機字符串,防止重複攻擊
oauth_signature_method - HMAC-SHA1 簽名方法
oauth_timestamp - 1272323042 時間戳
oauth_version - OAuth協議版本
我的理解:請求時,使用consumer_secret作爲密鑰對請求參數進行加密,而傳輸過程中只傳輸公鑰(consumer_key),所以在接口參數中只有oauth_consumer_key,而沒有包含上文提到的consumer_secret。
比如,文中提到的oauth_callback等參數作爲字符基串,生成oauth_signature:簽名值,再作爲請求參數傳輸。
POST&https://api.t.sina.com.cn/oauth/request_token&oauth_callback=http://loca
8wUi7m5HFQy76nowoCThusfgB+Q=
OAuth oauth_nonce="QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk",
oauth_callback="http://localhost:3005
oauth_token=8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc&oauth_token_secret=x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA&oauth_callback_confirmed=true
用戶認證
- oauth_token 上一步獲(即:oauth/request_token接口調用)取到的oauth token
- oauth_callback, 需要進行url encode
-
display,定義頁面調用類型,目前我們提供了6種調用類型
Android,iPhone調用:display=mobile
wap訪問頁面自動調用:display=wap 我們會根據信息頭來判斷是wap1.2還是wap2.0
wap1.2頁面調用:display=wap1.2 供wap1.2訪問
wap2.0頁面調用:display=wap2.0 供wap2.0訪問
- userId 新浪通行證賬戶名
- passwd 密碼
使用說明
- 當請求參數 oauth_callback=oob 則表明爲桌面應用,會提示用戶做桌面應用操作.
- oauth_callback=json, 頁面直接返回參數
{"oauth_token":"c248561721393a78260b8d00ece7d703", "oauth_verifier":"234256"}
- oauth_callback=xml, 頁面直接返回參數
<oauth_token>c248561721393a78260b8d00ece7d703</oauth_token> <oauth_verifier>234256</oauth_verifier>
oauth_token=8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc&oauth_verifier=pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY
這一步,我們需要獲取oauth_token ,oauth_verifier。
獲取access token(授權過的Oauth_token)
oauth_consumer_key - GDdmIQH6jhtmLUypg82g 創建應用時生成的APP KEY。
oauth_nonce - 9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8 單次值,一個隨機字符串 oauth_signature_method - HMAC-SHA1 簽名方法
oauth_token - 8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc 經過用戶授權的Request Token。
oauth_timestamp - 1272323047 時間戳
oauth_verifier - pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY 可選。在oauth/authorize這一步中,新浪微博給出的認證碼。
oauth_version - 1.0 Oauth版本號
oauth_token_secret - x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA
參數說明:
- oauth_consumer_key: 創建應用時生成的APP KEY。
- oauth_token:經過用戶授權的Request Token。
- oauth_signature_method: 簽名方法,建議使用“HMAC-SHA1”。
- oauth_timestamp:時間戳。生成Base String時的時間戳。
- oauth_nonce:單次值,一個隨機字符串,防止重複攻擊。該參數只支持ASCII碼的字符串.
- oauth_version : OAuth協議版本。填寫“1.0”。
- oauth_verifier: 可選。在oauth/authorize這一步中,新浪微博給出的認證碼。
- oauth_signature:簽名值,是由根據上面的幾個參數生成的 Base String經HMAC-SHA1算法計算得出。
POST&https://api.t.sina.com.cn/oauth/access_token&oauth_consumer_key=GDdmIQH6jhtmLUypg82g&oauth_nonce=9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1272323047&oauth_token=8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc&oauth_verifier=pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY&oauth_version=1.0
MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98&x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA
PUw/dHA4fnlJYM6RhXk5IU/0fCc=
OAuth oauth_nonce="9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8",
oauth_signature_method="HMAC-SHA1",
oauth_timestamp="1272323047",
oauth_consumer_key="GDdmIQH6jhtmLUypg82g", oauth_token="8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc", oauth_verifier="pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY", oauth_signature="PUw/dHA4fnlJYM6RhXk5IU/0fCc=",
oauth_version="1.0"
oauth_token=819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw&oauth_token_secret=J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA&
user_id=819797&
screen_name=openapi
獲取用戶信息
必選 | 類型及範圍 | 說明 | |
---|---|---|---|
source | true | string | 申請應用時分配的AppKey,調用接口時候代表應用的唯一身份。(採用OAuth授權方式不需要此參數) |
:id | false | int64/string | 用戶ID(int64)或者暱稱(string)。該參數爲一個REST風格參數。調用示例見注意事項 |
user_id | false | int64 | 用戶ID,主要是用來區分用戶ID跟微博暱稱。當微博暱稱爲數字導致和用戶ID產生歧義,特別是當微博暱稱和用戶ID一樣的時候,建議使用該參數 |
screen_name | false | string | 微博暱稱,主要是用來區分用戶UID跟微博暱稱,當二者一樣而產生歧義的時候,建議使用該參數 |
:id、user_id、screen_name這三個參數三者至少要提供一個 |
oauth_consumer_key - GDdmIQH6jhtmLUypg82g
oauth_nonce - oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y
oauth_signature_method - HMAC-SHA1
oauth_token - 819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw
oauth_timestamp - 1272325550
oauth_version - 1.0
POST&http://api.t.sina.com.cn/account/verify_credentials&oauth_consumer_key=GDdmIQH6jhtmLUypg82g&oauth_nonce=9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1272325550&oauth_token=819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw&oauth_verifier=pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY&oauth_version=1.0
MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98&J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA
ICuKVLKetCO4axEppJBqOofFg/A=
OAuth oauth_nonce="oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y",
oauth_signature_method="HMAC-SHA1",
oauth_timestamp="1272325550",
oauth_consumer_key="GDdmIQH6jhtmLUypg82g",
oauth_token="819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw", oauth_signature="ICuKVLKetCO4axEppJBqOofFg/A=",
oauth_version="1.0"
{ weibo=null,
id=1803876591,
name='loopa',
screenName='loopa',
location='北京 海淀區',
description='2fBAcRG0]8OGRvp',
profileImageUrl='http://tp4.sinaimg.cn/1803876591/50/0',
url='',
isProtected=false,
followersCount=23,
statusCreatedAt=Mon Sep 27 13:50:14 CST 2010,
statusId=2847344825, statusText='uhYFQJ[',
statusSource='<a href="" rel="nofollow">微博開放平臺接口</a>',
statusTruncated=false,
statusInReplyToStatusId=0,
statusInReplyToUserId=0,
statusFavorited=false,
statusInReplyToScreenName='',
profileBackgroundColor='',
profileTextColor='',
profileLinkColor='',
profileSidebarFillColor='',
profileSidebarBorderColor='',
friendsCount=1,
createdAt=Fri Aug 27 00:00:00 CST 2010,
favouritesCount=0,
utcOffset=-1,
timeZone='',
profileBackgroundImageUrl='',
profileBackgroundTile='',
following=false,
notificationEnabled=false,
statusesCount=8509,
geoEnabled=false,
verified=false }