当前位置 > 首页 > Asp.net

使用DotNetOpenAuth来实现有道云笔记的授权

2012-12-3 2:33:00来源:Asp.net

     最近由于公司的需求特别多,而且还不是一个项目的需求,几个数据库几个VS来回切换。难免搞混搞乱,忘记。于是自己用WPF做了一个小工具:AgileToDo,一个待办列表。本来使用sqlce来做本地的存储。但是在这个云时代,搞本地存储显然不能拿出手。于是我决定给它集成有道云笔记,使用有道云笔记的的OPEN API来实现云端的存储。http://note.youdao.com/open/apidoc.html

     有道云笔记的API使用OAuth的方式对第三方应用进行授权。OAuth的介绍就不多说了,说的人也挺多了,自己查资料吧。要使用它的API,我们需要授权。本来想完全有自己去实现一下这个过程的,不过看了授权的整个过程发现还是很复杂的,不花点时间估计还真搞不出来。于是用nuget搜一下发现了DotNetOpenAuth,而且这个类库的排名是很靠前的,想必是个神器。大声笑这里简单说一下DotNetOpenAuth,据我简单了解,DotNetOpenAuth主要是分了2部分的功能。一部分类库是作为消费者,访问第三方OAUTH服务,请求授权,比如我现在要做的事,访问有道云笔记的OAUTH服务。还有一部分类库是用做服务方,实现OAUTH服务提供方的功能,可以使你的用户系统支持OAUTH,供第三方消费者来使用。要深入了解的请直接去下载源码,而且里面包含了很多sample,有web的有desktop的,访问google,twitter的例子等等等。我的代码当然也是参考了这些sample。

      经过一晚上的折腾,终于用.NET实现了有道云笔记的授权。废话不多说,上代码吧。

1.添加DotNetOpenAuth的引用

image

2.YDAuthBaseInfo类

/// <summary>
/// OAUTH授权所需的一些基础信息
/// </summary>
public class YDAuthBaseInfo
{
public static readonly string OwnerId = "";
public static readonly string ConsumerName = "";
public static readonly string ConsumerKey = "";//开发者申请的KEY
public static readonly string ConsumerSecret = "";//开发者申请的Secret

public static readonly string BaseUrl = "http://sandbox.note.youdao.com";//测试沙箱基础url
public static readonly ServiceProviderDescription ServiceDescription = null;//OAUTH服务提供方信息
static YDAuthBaseInfo()
{
OwnerId = "kklldog";
ConsumerName = "AgileToDo";
ConsumerKey = "xxxx";
ConsumerSecret = "xxxx";
ServiceDescription = new ServiceProviderDescription
{
RequestTokenEndpoint = new MessageReceivingEndpoint(YDAuthBaseInfo.BaseUrl + "/oauth/request_token",
HttpDeliveryMethods.AuthorizationHeaderRequest | HttpDeliveryMethods.GetRequest),
UserAuthorizationEndpoint = new MessageReceivingEndpoint(YDAuthBaseInfo.BaseUrl + "/oauth/authorize",
HttpDeliveryMethods.AuthorizationHeaderRequest | HttpDeliveryMethods.GetRequest),
AccessTokenEndpoint = new MessageReceivingEndpoint(YDAuthBaseInfo.BaseUrl + "/oauth/access_token",
HttpDeliveryMethods.AuthorizationHeaderRequest | HttpDeliveryMethods.GetRequest),
TamperProtectionElements = new ITamperProtectionChannelBindingElement[] { new HmacSha1SigningBindingElement() },
};
}


}

3.YDTokenManager 类

/// <summary>
/// TokenManager 令牌管理
/// </summary>
public class YDTokenManager : IConsumerTokenManager
{
private Dictionary<string, string> _tokensAndSecrets = new Dictionary<string, string>();
private TokenType _tokenType;
/// <summary>