使用DotNetOpenAuth来实现有道云笔记的授权
2012-12-03 02:19
369 查看
最近由于公司的需求特别多,而且还不是一个项目的需求,几个数据库几个VS来回切换。难免搞混搞乱,忘记。于是自己用WPF做了一个小工具:AgileToDo,一个待办列表。本来使用sqlce来做本地的存储。但是在这个云时代,搞本地存储显然不能拿出手。于是我决定给它集成有道云笔记,使用有道云笔记的的OPENAPI来实现云端的存储。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的引用
2.YDAuthBaseInfo类
3.YDTokenManager类
5.有了这些我们就可以去请求授权了。让我们来试试,新建一个ASP.NET项目,在Default.aspx下修改代码
有了AccessToken跟AccessSecret我们就可以去访问有道云笔记的操作API了:创建,删除,修改笔记了。这部分接下来我也会实现。
希望对于需要了解OAUTH跟DOTNETOPENAUTH的同学能有帮助。
有道云笔记的API使用OAuth的方式对第三方应用进行授权。OAuth的介绍就不多说了,说的人也挺多了,自己查资料吧。要使用它的API,我们需要授权。本来想完全有自己去实现一下这个过程的,不过看了授权的整个过程发现还是很复杂的,不花点时间估计还真搞不出来。于是用nuget搜一下发现了DotNetOpenAuth,而且这个类库的排名是很靠前的,想必是个神器。
这里简单说一下DotNetOpenAuth,据我简单了解,DotNetOpenAuth主要是分了2部分的功能。一部分类库是作为消费者,访问第三方OAUTH服务,请求授权,比如我现在要做的事,访问有道云笔记的OAUTH服务。还有一部分类库是用做服务方,实现OAUTH服务提供方的功能,可以使你的用户系统支持OAUTH,供第三方消费者来使用。要深入了解的请直接去下载源码,而且里面包含了很多sample,有web的有desktop的,访问google,twitter的例子等等等。我的代码当然也是参考了这些sample。
经过一晚上的折腾,终于用.NET实现了有道云笔记的授权。废话不多说,上代码吧。
1.添加DotNetOpenAuth的引用
2.YDAuthBaseInfo类
///<summary> ///OAUTH授权所需的一些基础信息 ///</summary> publicclassYDAuthBaseInfo { publicstaticreadonlystringOwnerId=""; publicstaticreadonlystringConsumerName=""; publicstaticreadonlystringConsumerKey="";//开发者申请的KEY publicstaticreadonlystringConsumerSecret="";//开发者申请的Secret publicstaticreadonlystringBaseUrl="http://sandbox.note.youdao.com";//测试沙箱基础url publicstaticreadonlyServiceProviderDescriptionServiceDescription=null;//OAUTH服务提供方信息 staticYDAuthBaseInfo() { OwnerId="kklldog"; ConsumerName="AgileToDo"; ConsumerKey="xxxx"; ConsumerSecret="xxxx"; ServiceDescription=newServiceProviderDescription { RequestTokenEndpoint=newMessageReceivingEndpoint(YDAuthBaseInfo.BaseUrl+"/oauth/request_token", HttpDeliveryMethods.AuthorizationHeaderRequest|HttpDeliveryMethods.GetRequest), UserAuthorizationEndpoint=newMessageReceivingEndpoint(YDAuthBaseInfo.BaseUrl+"/oauth/authorize", HttpDeliveryMethods.AuthorizationHeaderRequest|HttpDeliveryMethods.GetRequest), AccessTokenEndpoint=newMessageReceivingEndpoint(YDAuthBaseInfo.BaseUrl+"/oauth/access_token", HttpDeliveryMethods.AuthorizationHeaderRequest|HttpDeliveryMethods.GetRequest), TamperProtectionElements=newITamperProtectionChannelBindingElement[]{newHmacSha1SigningBindingElement()}, }; } }
3.YDTokenManager类
///<summary> ///TokenManager令牌管理 ///</summary> publicclassYDTokenManager:IConsumerTokenManager { privateDictionary<string,string>_tokensAndSecrets=newDictionary<string,string>(); privateTokenType_tokenType; ///<summary> ///Initializesanewinstanceofthe<seecref="YDTokenManager"/>class. ///</summary> ///<paramname="consumerKey">Theconsumerkey.</param> ///<paramname="consumerSecret">Theconsumersecret.</param> publicYDTokenManager(stringconsumerKey,stringconsumerSecret) { if(string.IsNullOrEmpty(consumerKey)) { thrownewArgumentNullException("consumerKey"); } this.ConsumerKey=consumerKey; this.ConsumerSecret=consumerSecret; } ///<summary> ///Getstheconsumerkey. ///</summary> ///<value>Theconsumerkey.</value> publicstringConsumerKey{get;privateset;} ///<summary> ///Getstheconsumersecret. ///</summary> ///<value>Theconsumersecret.</value> publicstringConsumerSecret{get;privateset;} #regionITokenManagerMembers publicstringGetTokenSecret(stringtoken) { returnthis._tokensAndSecrets[token]; } publicvoidStoreNewRequestToken(UnauthorizedTokenRequestrequest,ITokenSecretContainingMessageresponse) { this._tokensAndSecrets[response.Token]=response.TokenSecret; _tokenType=TokenType.RequestToken; } publicvoidExpireRequestTokenAndStoreNewAccessToken(stringconsumerKey,stringrequestToken,stringaccessToken,stringaccessTokenSecret) { this._tokensAndSecrets.Remove(requestToken); this._tokensAndSecrets[accessToken]=accessTokenSecret; _tokenType=TokenType.AccessToken; } ///<summary> ///Classifiesatokenasarequesttokenoranaccesstoken. ///</summary> ///<paramname="token">Thetokentoclassify.</param> ///<returns>RequestorAccesstoken,orinvalidifthetokenisnotrecognized.</returns> publicTokenTypeGetTokenType(stringtoken) { return_tokenType; } #endregion }
4.YDWebConsumer类
///<summary>
///有道OPENAUTH的web端消费者实现
///</summary>
publicclassYDWebConsumer:WebConsumer
{
publicYDWebConsumer(ServiceProviderDescriptionserviceProvider,IConsumerTokenManagertokenManager)
:base(serviceProvider,tokenManager)
{
}
///<summary>
///请求授权
///</summary>
///<paramname="consumer"></param>
publicstaticvoidRequestAuthorization(YDWebConsumerconsumer)
{
if(consumer==null)
{
thrownewArgumentNullException("YDWebConsumer");
}
Uricallback=GetCallbackUrlFromContext();
varrequest=consumer.PrepareRequestUserAuthorization(callback,null,null);
consumer.Channel.Send(request);
}
///<summary>
///获取CALLBACKURL
///</summary>
///<returns></returns>
internalstaticUriGetCallbackUrlFromContext()
{
Uricallback=MessagingUtilities.GetRequestUrlFromContext().StripQueryArgumentsWithPrefix("oauth_");
returncallback;
}
}
5.有了这些我们就可以去请求授权了。让我们来试试,新建一个ASP.NET项目,在Default.aspx下修改代码
<%@PageTitle="主页"Language="C#"MasterPageFile="~/Site.master"AutoEventWireup="true"
CodeBehind="Default.aspx.cs"Inherits="YDOpenAPI._Default"%>
<asp:ContentID="HeaderContent"runat="server"ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:ContentID="BodyContent"runat="server"ContentPlaceHolderID="MainContent">
<h2>
欢迎使用ASP.NET!
</h2>
<asp:Labelrunat="server"ID="lbl"></asp:Label>
</asp:Content>
protectedvoidPage_Load(objectsender,EventArgse)
{
if(!IsPostBack)
{
varyouDao=newYDWebConsumer(YDAuthBaseInfo.ServiceDescription,this.TokenManager);
//是否已经授权
varaccessTokenResponse=youDao.ProcessUserAuthorization();
if(accessTokenResponse!=null)
{
this.AccessToken=accessTokenResponse.AccessToken;
this.lbl.Text="Token:"+this.AccessToken+"Screct:"+this.TokenManager.GetTokenSecret(this.AccessToken);
}
elseif(this.AccessToken==null)
{
YDWebConsumer.RequestAuthorization(youDao);
}
}
}
//TokenManager
privateYDTokenManagerTokenManager
{
get
{
vartokenManager=(YDTokenManager)Session["tokenManager"];
if(tokenManager==null)
{
stringconsumerKey=YDOpenAPI4N.YDAuthBaseInfo.ConsumerKey;
stringconsumerSecret=YDOpenAPI4N.YDAuthBaseInfo.ConsumerSecret;
if(!string.IsNullOrEmpty(consumerKey))
{
tokenManager=newYDTokenManager(consumerKey,consumerSecret);
Session["tokenManager"]=tokenManager;
}
}
returntokenManager;
}
}
跑一下是不是成功了。
有了AccessToken跟AccessSecret我们就可以去访问有道云笔记的操作API了:创建,删除,修改笔记了。这部分接下来我也会实现。
希望对于需要了解OAUTH跟DOTNETOPENAUTH的同学能有帮助。
相关文章推荐
- [转]ASP.NET MVC 3 使用 DotNetOpenAuth 实现SSO
- [原]ASP.NET MVC 3 使用 DotNetOpenAuth 实现SSO
- 使用DotNetOpenAuth搭建OAuth2.0授权框架——Demo代码简单说明
- 使用DotNetOpenAuth搭建OAuth2.0授权框架
- 用DotNetOpenAuth实现基于OAuth 2.0的web api授权 (一)Getting Start
- ASP.NET MVC 3 使用 DotNetOpenAuth 实现SSO
- DotNetOpenAuth Part 1 : Authorization 验证服务实现及关键源码解析
- [OAuth]基于DotNetOpenAuth实现Client Credentials Grant
- 基于DotNetOpenAuth实现OpenID 服务提供者<shou>
- 基于DotNetOpenAuth实现Client Credentials Grant
- 基于DotNetOpenAuth的OAuth实现示例代码: 获取access token
- 基于DotNetOpenAuth实现OpenID 服务提供者
- mvc中DotNetOpenAuth实现了第三方应用访问自己的网站
- 使用share SDK实现人人网授权登录分享(1.x版本)
- Claim-based-security for ASP.NET Web APIs using DotNetOpenAuth
- 玩转OpenStack网络Neutron(2)--使用Open vSwitch实现VLAN类型租户网络
- iOS开发中 实现登录时关于使用QQ做为第三方授权登录的问题
- vba使用win32 API(GetOpenFileName )实现打开文件对话框
- ASP.NET Web API 2 使用 AuthorizationFilter(授权过滤器)实现 Basic 认证
- Zend Framework之Zend_Auth,Zend_Acl实现用户的授权和操作