这几天在做新浪微博客户端,由于以前接触的大多为Socket编程,而对于Http协议编程还存在不少盲区,所以费了不少功夫,好了、闲话少说,总结一下。
一、OAuth概述
为了使用新浪微博开放平台提供的API(应用程序接口),你需要先注册一个应用。我们会给每一个应用一个专属的App
Key和App
Secret。Key跟Secret的使用方式跟其他一些协议中的公钥私钥的方案相类似,你可以使用你所熟悉的编程语言将key和secret结合,为你发出的每个请求添加签名,以此来向新浪微博开放平台表明自己身份的合法性。
二、OAuth认证基本流程
OAuth提供两种认证方式:query-string和http headers。我们推荐使用http header进行认证。
其中需要的几个URL
public
const string HTTP_REQUEST_TOKEN = "http://api.t.sina.com.cn/oauth/request_token";
public const string HTTP_AUTHORIZE = "http://api.t.sina.com.cn/oauth/authorize";
public const string HTTP_ACCESS_TOKEN = "http://api.t.sina.com.cn/oauth/access_token";
public
const string HTTP_VERIFY = "http://api.t.sina.com.cn/account/verify_credentials.json";
三、请求签名
所有的OAuth请求使用同样的算法来生成(signature base string)签名字符基串和签名。
base string是把http方法名,请求URL以及请求参数用&字符连起来后做URL Encode编码。具体来讲,base string由http方法名,之后是&,接着是过url编码(url-encoded)之后的url和访问路径及&。接下来,把所有的请求参数包括POST方法体中的参数,经过排序(按参数名进行文本排序,如果参数名有重复则再安参数值进行重复项目排序),使用%3D替代=号,并且使用%26作为每个参数之间的分隔符,拼接成一个字符串。
这个算法可以简单表示为:
httpMethod + "&" +
url_encode( base_uri ) + "&" +
sorted_query_params.each { | k, v |
url_encode ( k ) + "%3D" +
url_encode ( v )
}.join("%26")
无论生成何种OAuth1.0请求,生成BASE STRING的规则始终不变。
新浪微博要求所有的OAuth请求都使用HMAC-SHA1算法生成签名。
注意:
1)用于生成“签名字符基串”的参数是要经过排序的。
2)用于生成“签名字符基串”的参数是请求中带有所有参数[包括Get、Post请求的所有参数,但是有一个特例:即使用Post请求
以 “multipart/form-data”
格式传输文件时、只有以oauth_开头的参数才能参与生成“签名字符基串”]
3)每一个参与生成“签名字符基串”的参数值都要经过URL
Encode编码。
OAuth提供两种认证方式:query-string和http headers。
如果是Querty-String认证大致的请求格式如下:
……&oauth_signature=UrlEncoHMAC-SHA1算法对“签名字符基串”进行加密生成的签名]);
如果是Http
headers认证,则需要在http协议头中加入一个键值对:
“键”为 “Authorization”
“值”为 "OAuth
"+【所有参数【包括oauth_signature这个参数、生成签名字符基串需要参数排序,但生成这个字符串不需要参数排序】使用 =分割
键与值,使用“逗号加一个空格”作为参数间的分隔符 】,生成后的形式大致为:"OAuth oauth_consumer_key=\"{0}\",
oauth_signature_method=\"HMAC-SHA1\",oauth_timestamp=\"{1}\",
oauth_nonce=\"{2}\", oauth_version=\"1.0\",
oauth_token=\"{3}\",oauth_signature=\"{4}\""
关于更多的新浪微博OAuth请参见:http://open.weibo.com/wiki/Oauth