`
从此醉
  • 浏览: 1046627 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

豆瓣api之OAuth认证

 
阅读更多

豆瓣api通过OAuth允许第三方应用访问用户数据,所以OAuth认证就是我们整个project的基础了。

OAuth认证听起来挺神秘,其实挺简单的。

现在的大型网站的开放平台的认证几乎都是采用OAuth,比如facebook,twitter,新浪微博等。

豆瓣的api有对于OAuth认证的专门说明:http://www.douban.com/service/apidoc/auth

在你使用OAuth认证之前,先仔细读一读文档非常有必要,因为中间过程出现一点偏差,你就不能被认证成功,所以仔细阅读官方文档是重中之重:http://oauth.net/documentation/spec/

如果你的英文不够给力的话,可以看看这篇中文的介绍,说的很清楚:http://www.supidea.com/post/oauth.aspx

google OAuth项目已经提供了OAuth的各种语言的库:http://code.google.com/p/oauth/

我们正式使用了google OAuth中的C#库:http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs

因为OAuth已经成为了第三方开发者使用豆瓣api的一大障碍,豆瓣曾经专门举办了一次活动来讲解如何通过OAuth使用豆瓣api:http://www.douban.com/online/10012959/

这次活动的源码在google code上可以找到:http://code.google.com/p/douban-oauth-sample/,我们正式参考了http://code.google.com/p/douban-oauth-sample/source/browse/trunk/csharp/DoubanOAuthBasicSample/DoubanOAuthBasicSample/Program.cs这个文件,对我们的帮助很大,省去了很多摸索的时间

作为命令行程序我们已经测试成功了,但是当移植到windows phone上之后就出现了问题

问题的关键在于silverlight版的网络方面的api和C#的不同,silverlight的api更少,这就导致了上面的库的一些网络访问要自己改写

仔细阅读httpwebrequest的文档后,我们发现,要进行一个网络请求,至少要三个函数,因为需要使用两次异步请求(BeginGetRequestStream,BeginGetResponse)

因为我们的豆瓣app几乎每个动作都要对豆瓣服务器进行请求,如果每个请求都需要写三个函数,并且还要增加认证信息的话,实在是太麻烦,代码会变得又臭又长

这时候DRY(don’t repeat yourself)就显得尤为重要了

作为pm,我决定把网络访问这一块封装好,给大家提供统一的,简单好用的借口。

我本准备自己把那两个异步请求封装起来,后来发现已经有现成的库可用,而且很好很强大。

这个库就是restsharp:http://restsharp.org/

而且restsharp还提供了windows phone对应的dll,很是方便,原来的三个函数现在只需要一个函数几行就可以搞定

对于很多请求,豆瓣都要求有认证才可以访问,根据豆瓣的文档“进行POST、PUT、DELETE请求时,豆瓣暂时不支持使用在url中或者post form中传递OAuth参数。因此你只能选择在header中传递OAuth参数”,看来我们只能把oauth加到http header中了。

我部分我统一封装了一下:
namespace AddOAuthHeader{
public class OAuthHeader{
string apiKey = "your api key";
string apiKeySecret = "your api key secret";
string accessToken;
string accessTokenSecret;
string uri;
string method;
OAuthBase oAuth = new OAuthBase();
IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;

public OAuthHeader(string uri, string method) {
this.uri = uri;
this.method = method;
}

public string getHeader(){
string nonce = oAuth.GenerateNonce();
string timeStamp = oAuth.GenerateTimeStamp();
string normalizeUrl, normalizedRequestParameters;

//accessToken = settings["accessToken"].ToString();
//accessTokenSecret = settings["accessTokenSecret"].ToString();

accessToken = "ee7ead643e6ea1a1cb7c082cbb4be4e3";
accessTokenSecret = "545138430a2dcc9b";

string sig = oAuth.GenerateSignature(
new Uri(uri),
apiKey,
apiKeySecret,
accessToken,
accessTokenSecret,
method,
timeStamp,
nonce,
OAuthBase.SignatureTypes.HMACSHA1,
out normalizeUrl,
out normalizedRequestParameters);
sig = HttpUtility.UrlEncode(sig);

StringBuilder oauthHeader = new StringBuilder();
oauthHeader.AppendFormat("OAuth realm=\"\", oauth_consumer_key={0}, ", apiKey);
oauthHeader.AppendFormat("oauth_nonce={0}, ", nonce);
oauthHeader.AppendFormat("oauth_timestamp={0}, ", timeStamp);
oauthHeader.AppendFormat("oauth_signature_method={0}, ", "HMAC-SHA1");
oauthHeader.AppendFormat("oauth_version={0}, ", "1.0");
oauthHeader.AppendFormat("oauth_signature={0}, ", sig);
oauthHeader.AppendFormat("oauth_token={0}", accessToken);

return oauthHeader.ToString();
}
}
}

传入一个url和一个方法(post or put or delete or get),我就给他返回一个oauth header,其他同学直接调用我的代码就好了,并不需要关心认证问题

那具体该如何来进行一个网络请求呢?

我写了两个例子,一个post的,一个get的。

向豆瓣传数据,post:(我把说明都写到了注释中)

// "POST" 实例,以发一条状态为例
private void button1_Click(object sender, RoutedEventArgs e)
{
//首先都要先实例化一个OAuthHeader,传入的参数为url和网络请求的方法(post or get or delete or put or something else)
OAuthHeader header = new OAuthHeader("http://api.douban.com/miniblog/saying", "POST");

//对于post,要传给服务器一些数据,豆瓣api用xml来传数据,就需要先build一个xml的string
StringBuilder requestBody = new StringBuilder("<?xml version='1.0' encoding='UTF-8'?>");
requestBody.Append("<entry xmlns:ns0=\"http://www.w3.org/2005/Atom\"xmlns:db=\"http://www.douban.com/xmlns/\">");
requestBody.Append("<content>hello world</content>");
requestBody.Append("</entry>");

//下面两行是每一个网络请求都需要的,即与api.douban.com建立一个连接
var client = new RestClient();
client.BaseUrl = "http://api.douban.com";

//下面这行的意思是产生一个请求,第一个参数是路径名(不是完整的url),后面是Method.POST 或 Method.GET 或Method.PUT 或 Method.DELETE
var request = new RestRequest("/miniblog/saying", Method.POST);

//下面进行一些http头的设置

//先设置request的format为xml
request.RequestFormat = DataFormat.Xml;
request.AddHeader("Content-Type", "application/atom+xml");

//然后是把生成的authorization写入http的header
request.AddHeader("Authorization", header.getHeader());

//最终把要上传的数据写入http请求中,注意要加上ParameterType.RequestBody
request.AddParameter("application/atom+xml", requestBody.ToString(), ParameterType.RequestBody);

//最后就是进行异步网络请求了,并且将传回的response的信息解析出来,呈现在页面上
client.ExecuteAsync(request, (response) =>
{
var resource = response.Content;
Debug.WriteLine(resource);
});
}

//GET实例,以获取好友列表为例,get比较简单,不需要传入数据
private void button3_Click(object sender, RoutedEventArgs e)
{
//同上
OAuthHeader header = new OAuthHeader("http://api.douban.com/people/34788764/contacts?start-index=1&max-results=50", "GET");

var client = new RestClient();
client.BaseUrl = "http://api.douban.com";

//注意,这里生成request的时候,不要把?后面的parameter加上,parameter要在后面的request.AddParameter处实现
var request = new RestRequest("/people/34788764/contacts", Method.GET);

//加上认证头
request.AddHeader("Authorization", header.getHeader());

//加上参数
request.AddParameter("start-index", "1");
request.AddParameter("max-results", "50");

client.ExecuteAsync(request, (response) =>
{
var resource = response.Content;
Debug.WriteLine(resource);
textBlock1.Text = resource;
});
}

这样就可以大大简化网络请求,真正做到了don’t repeat yourself

分享到:
评论

相关推荐

    C# 网络编程之豆瓣OAuth2.0认证API开发详解和实现(源码)

    该资源参考博客:http://blog.csdn.net/eastmount/article/details/26872793主要介绍豆瓣API开发过程中如何通过OAuth2.0认证授权访问用户自己信息的.豆瓣API的资源较少,有的基本是php和java的,所以想通过该资源讲述C#...

    Android 新浪、腾讯、人人、豆瓣、Facebook、Twitte.zip

    这是一款Android 新浪、腾讯、人人、豆瓣、Facebook、Twitter OAuth认证实例源码,豆瓣使用的是OAuth1.0,新浪、腾讯、人人、QQ则都是使用OAuth2.0,Fackbook和Twitter直接使用官方的sdk和api。   使用方法:导入...

    OAuth2.0源码(包括与新浪微波和QQ的连接)

    使用C#开发的OAuth2.0客户端,实现了与QQ和新浪微波的连接

    豆瓣备份工具

    accesstoken:这个初始为空,需要通过oauth认证之后才能得到 accesstokensecret:同上 apikey: 豆瓣API的api key。我的是0e9de689fedd51532bd9b39dfc97f3f9,也可以自己申请一个,然后填自己的。 apisecret: 豆瓣...

    douban-fm-client:豆瓣Fm API的Python客户端库(非官方版)

    OAuth2 认证 个人信息 添加红心/取消红心/不在收听/切歌 所有红心歌曲 歌词 与歌曲相关(相似兆赫/相关的节目) 播放新兆赫 我的兆赫/推荐兆赫/热门兆赫/上升最快兆赫/品牌兆赫 收藏的兆赫 收藏兆赫/取消收藏 播放节目...

    java版直播间源码-Douban-Java-SDK-OAuth2:豆瓣JavaSDKOAuth2

    完美转换豆瓣API所使用的GData/Atom类型的xml以及json致简单易读易懂易用的JavaBean '豆瓣社区/书影音/豆瓣说'全覆盖 - 全面支持豆瓣开放了的API 几乎支持全部豆瓣开放平台中开放了的API 错误处理 - 轻松了解为何...

    Android 豆瓣网 源代码

    了解web2.0 API 开发WEB2.0手机客户端应用程序 Android系统和标准的Web2.0网站交互 Web2.0的OAUTH认证 还可以学习下web2.0应用设计流程

    关于微信小程序API认证

    API认证方式有Basic Auth和OAuth 1.Basic Auth比较好理解,就是每次请求API时都提供用户的username和password,使用简单,开发和调试工作简单,没有过多的复杂页面跳转逻辑和交互过程;但是安全性低,每次都需要传递...

    JAVA上百实例源码以及开源项目源代码

    Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 ...

    java开源包1

    目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...

    java开源包11

    目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...

    java开源包2

    目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...

    java开源包3

    目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...

    java开源包6

    目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...

    java开源包5

    目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...

    java开源包10

    目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...

    java开源包4

    目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...

    java开源包8

    目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...

    java开源包7

    目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...

    java开源包9

    目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...

Global site tag (gtag.js) - Google Analytics