新浪微博——OAuth

这几天在做新浪微博客户端,由于以前接触的大多为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

posted @ 2011-09-21 10:58  把爱延续  阅读(925)  评论(2编辑  收藏  举报