随笔-2  评论-5  文章-0  trackbacks-0
  置顶随笔
摘要: 这昨天为自己的网站实现了QQ登陆的功能,虽然,没有进行绑定,但是在技术层面上来说,已经了解了一点腾讯开放平台的协议.具体什么是OAUTH,请您GG一下吧...关于腾讯的开放平台,最主要的就是参数一定不能多,能有的要有,不能有的一定不能有.不然提交过去,就会提示什么什么错了.最关键的就是签名的方式,下面就是我的签名的代码1///<summary>2///每一步不同的生成签名的方式3///</summary>4///<returns></returns>5protectedvirtualStringBuildSignature(StringSigna阅读全文
posted @ 2011-09-15 11:37 小宇.net 阅读(2859) 评论(5) 编辑
  2011年9月30日

因之前公布的DLL插件有太多问题,然后抽了一点时间,改了一下

现在把源代码发出来,因为有人问我要源码.

下面是在我的项目里的简单应用的方法.

 

Actions
 1 public ActionResult Tencent()
 2         {
 3             var CallbackUrl = String.Format("http://{0}/TencentToken", Request.GetString("Http_Host"));
 4             var Tenc = new TencentBeginOAuthToken(
 5                                 appId,
 6                                 appKey,
 7                                 "http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token");
 8             String Url = Tenc.RequestUrl("http://openapi.qzone.qq.com/oauth/qzoneoauth_authorize", CallbackUrl);
 9             Session["AuthorizedTokenKey"] = Tenc.AuthorizedTokenKey;//保存OAuthParameterName.oauth_token_secret ,授权的临时token对应的密钥
10             if (Url.IsEmpty())
11                 return Content("获取临时授权失败,用户未能登陆");
12             else
13                 return Redirect(Url);
14         }
15 
16         [AcceptVerbs(HttpVerbs.Get)]
17         public ActionResult TencentToken()
18         {
19             if (Session["AuthorizedTokenKey"] == null)
20                 return ErrorView("页面出现内部错误,请联系管理员");
21             //
22             var Tenc = new TencentLoginedOAuthToken(appId, appKey, Request.GetQueryString);
23             Tenc.AuthorizedTokenKey = Session["AuthorizedTokenKey"].ToString();
24             var AccessTokenString = Tenc.RequestUrl("http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token""");
25             var OpenIDDict = OAuthHelper.CreateParamFromReturnToken(AccessTokenString);
26             var AccessToken = new TencentAccessedToken(TencentAccessType.GetUserInfo, appId, appKey, OpenIDDict);
27 
28             //在这里已经获得了openid,就可以判断了
29             if (OpenIDDict.ContainsKey(OAuthParameterName.openid) == false)
30             {
31                 return ErrorView("QQ登陆失败,请确定你的密码"true);
32             }
33             var OpenID = OpenIDDict[OAuthParameterName.openid].Value;
         //这里是在我的项目内根把这个openid获得用户的信息.
34             var Member = ServicesProcess.WM_Member.SelectFromTencent(OpenIDDict[OAuthParameterName.openid].Value);
35             if (Member != null)
36             {
37                 this.Login(Member);
38                 this.SaveLogin(1);
39                 return NoticeView("登陆成功,欢迎您""/index");
40             }
41             //没有登陆过,那就开始组织一个账户
42             var Data = AccessToken.RequestUrl("http://openapi.qzone.qq.com/user/get_user_info""");
43             var UserInfoDict = OAuthHelper.CreateParamFromJson(Data);
44             if (UserInfoDict.ContainsKey(OAuthParameterName.nickname))
45             {
46                 var UserInfo = new TencentUserInfo();
47                 UserInfo.OpenID = OpenID;
48                 return View(UserInfo); //返回一个提供用户选择注册还是绑定以有账号的页面
49             }
50 
51             return ErrorView("登陆失败,返回首页""/index");
52         }

 

代码有些简漏....望老大们海涵...

 

这里是下载地址 : 下载源码 

讲解文档,之前已经发过一份PDF了,就不发了...

测试地址也不发了.自己试吧...不过原地址没变..

posted @ 2011-09-30 19:44 小宇.net 阅读(497) 评论(0) 编辑
  2011年9月15日

这昨天为自己的网站实现了QQ登陆的功能,虽然,没有进行绑定,但是在技术层面上来说,已经了解了一点腾讯开放平台的协议.

具体什么是OAUTH,请您GG一下吧...

 

关于腾讯的开放平台,最主要的就是参数一定不能多,能有的要有,不能有的一定不能有.不然提交过去,就会提示什么什么错了.

最关键的就是签名的方式,下面就是我的签名的代码

 

 1  /// <summary>
 2         /// 每一步不同的生成签名的方式
 3         /// </summary>
 4         /// <returns></returns>
 5         protected virtual String BuildSignature(String SignatureHost)
 6         {
 7             String PostMethodString = "GET&";
 8             StringBuilder ParamString = new StringBuilder();
 9             this.CurrentStepParameters
10                 .OrderBy(c => c.Key.ToString())
11                 .ToList()
12                 .ForEach(c =>
13                         {
14                             if (c.Key != OAuthParameterName.oauth_signature &&
15                                 c.Key != OAuthParameterName.timestamp)
16                             {
17                                 if (ParamString.Length > 0)
18                                 {
19                                     ParamString.Append("&");
20                                 }
21                                 var p = c.Value;
22                                 ParamString.Append(p.OAuthOringinaName);
23                                 ParamString.Append("=");
24                                 ParamString.Append(p.Value);
25                             }
26                         }
27                 );
28             StringBuilder SignData = new StringBuilder();
29             SignData.Append(PostMethodString);
30             SignData.Append(OAuthHelper.UrlEncode(SignatureHost));
31             SignData.Append("&");
32             SignData.Append(OAuthHelper.UrlEncode(ParamString.ToString()));
33 
34             //密钥
35             String SecretKey = String.Format("{0}&{1}"this.AppKey, this.AuthorizedTokenKey);
36             String SignContent = SignData.ToString();
37             String Signature = Convert.ToBase64String(OAuthHelper.HMACSHA1Code(SignContent, SecretKey));
38             return Signature;
39         }

这里的CurrentStepParameters是在构造方式里进行赋值,或者其它地方,签名里最关键的,就是oauth_signature和timestamp这两个参数,要记得去掉,在这里,我选择了过滤.

因为有的时候,CurrentStepParameters这个字典从querystring来生成的话会简单点还有能复用.

在所有参数中,有几个是经常会用到的.

所以,在此我建立了一个通用参数生成方法

 

 1 protected virtual void AddCommonParameters()
 2         {
 3             if (this.CurrentStepParameters != null)
 4             {
 5                 //增加通用参数
 6                 this.CurrentStepParameters.AddParam(OAuthParameterName.oauth_consumer_key, this.AppID);
 7                 this.CurrentStepParameters.AddParam(OAuthParameterName.oauth_nonce, DateTime.UtcNow.Ticks.ToString());
 8                 this.CurrentStepParameters.AddParam(OAuthParameterName.oauth_timestamp, OAuthHelper.GenerateTimestamp());
 9                 this.CurrentStepParameters.AddParam(OAuthParameterName.oauth_version, "1.0");
10                 this.CurrentStepParameters.AddParam(OAuthParameterName.oauth_signature_method, "HMAC-SHA1");
11                 this.CurrentStepParameters.AddParam(OAuthParameterName.oauth_client_ip, "1");
12 
13                 if (this.CurrentStepParameters.ContainsKey(OAuthParameterName.oauth_token_secret))
14                 {
15                     this.AuthorizedTokenKey = CurrentStepParameters[OAuthParameterName.oauth_token_secret].Value;
16                 }
17 
18                 if (this.CurrentStepParameters.ContainsKey(OAuthParameterName.oauth_signature))
19                 {
20                     CurrentStepParameters.Remove(OAuthParameterName.oauth_signature);
21                 }
22 
23                 if (this.CurrentStepParameters.ContainsKey(OAuthParameterName.timestamp))
24                 {
25                     CurrentStepParameters.Remove(OAuthParameterName.timestamp);
26                 }
27             }
28         }

下面是一个测试地址 :http://www.changshu.so/Tencent , 之后等完成绑定后,地址会删除

组件下载地址 : http://files.cnblogs.com/sam251/CSCMS.Secrity.OAuth.rar 

后续还有绑定的需要自己去实现了.如果能有通用的方式,我会定时更新,另外,其它OAUTH,比如SINA的,正在研究.

本程序里的OAuthHelper.GenerateTimestamp()及OAuthHelper.UrlEncode都是来自网上其它朋友的方法.

 

源不源码也没有什么重要了.因为整合在自己的网站里,所以,只是给出了一个DLL,要源码的可以找我,我可以发你.

 

posted @ 2011-09-15 11:37 小宇.net 阅读(2859) 评论(5) 编辑
  
昵称:小宇.net
园龄:4年7个月
粉丝:5
关注:0
<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

搜索

 
 

常用链接

随笔分类

随笔档案

友情连接

最新评论