这昨天为自己的网站实现了QQ登陆的功能,虽然,没有进行绑定,但是在技术层面上来说,已经了解了一点腾讯开放平台的协议。
具体什么是OAUTH,请您GG一下吧...
关于腾讯的开放平台,最主要的就是参数一定不能多,能有的要有,不能有的一定不能有.不然提交过去,就会提示什么什么错了。
最关键的就是签名的方式,下面就是我的签名的代码:
- /// <summary>
- /// 每一步不同的生成签名的方式
- /// </summary>
- /// <returns></returns>
- protected virtual String BuildSignature(String SignatureHost)
- {
- String PostMethodString = "GET&";
- StringBuilder ParamString = new StringBuilder();
- this.CurrentStepParameters
- .OrderBy(c => c.Key.ToString())
- .ToList()
- .ForEach(c =>
- {
- if (c.Key != OAuthParameterName.oauth_signature &&
- c.Key != OAuthParameterName.timestamp)
- {
- if (ParamString.Length > 0)
- {
- ParamString.Append("&");
- }
- var p = c.Value;
- ParamString.Append(p.OAuthOringinaName);
- ParamString.Append("=");
- ParamString.Append(p.Value);
- }
- }
- );
- StringBuilder SignData = new StringBuilder();
- SignData.Append(PostMethodString);
- SignData.Append(OAuthHelper.UrlEncode(SignatureHost));
- SignData.Append("&");
- SignData.Append(OAuthHelper.UrlEncode(ParamString.ToString()));
- //密钥
- String SecretKey = String.Format("{0}&{1}", this.AppKey, this.AuthorizedTokenKey);
- String SignContent = SignData.ToString();
- String Signature = Convert.ToBase64String(OAuthHelper.HMACSHA1Code(SignContent, SecretKey));
- return Signature;
- }
这里的CurrentStepParameters是在构造方式里进行赋值,或者其它地方,签名里最关键的,就是oauth_signature和timestamp这两个参数,要记得去掉,在这里,我选择了过滤。
因为有的时候,CurrentStepParameters这个字典从querystring来生成的话会简单点还有能复用。
在所有参数中,有几个是经常会用到的。
所以,在此我建立了一个通用参数生成方法。
- protected virtual void AddCommonParameters()
- {
- if (this.CurrentStepParameters != null)
- {
- //增加通用参数
- this.CurrentStepParameters.AddParam(OAuthParameterName.oauth_consumer_key, this.AppID);
- this.CurrentStepParameters.AddParam(OAuthParameterName.oauth_nonce, DateTime.UtcNow.Ticks.ToString());
- this.CurrentStepParameters.AddParam(OAuthParameterName.oauth_timestamp, OAuthHelper.GenerateTimestamp());
- this.CurrentStepParameters.AddParam(OAuthParameterName.oauth_version, "1.0");
- this.CurrentStepParameters.AddParam(OAuthParameterName.oauth_signature_method, "HMAC-SHA1");
- this.CurrentStepParameters.AddParam(OAuthParameterName.oauth_client_ip, "1");
- if (this.CurrentStepParameters.ContainsKey(OAuthParameterName.oauth_token_secret))
- {
- this.AuthorizedTokenKey = CurrentStepParameters[OAuthParameterName.oauth_token_secret].Value;
- }
- if (this.CurrentStepParameters.ContainsKey(OAuthParameterName.oauth_signature))
- {
- CurrentStepParameters.Remove(OAuthParameterName.oauth_signature);
- }
- if (this.CurrentStepParameters.ContainsKey(OAuthParameterName.timestamp))
- {
- CurrentStepParameters.Remove(OAuthParameterName.timestamp);
- }
- }
- }
下面是一个测试地址:http://www.changshu.so/Tencent ,之后等完成绑定后,地址会删除。
组件下载地址:http://files.cnblogs.com/sam251/CSCMS.Secrity.OAuth.rar
后续还有绑定的需要自己去实现了。如果能有通用的方式,我会定时更新,另外,其它OAUTH,比如SINA的,正在研究。
本程序里的OAuthHelper.GenerateTimestamp()及OAuthHelper.UrlEncode都是来自网上其它朋友的方法。
源不源码也没有什么重要了。因为整合在自己的网站里,所以,只是给出了一个DLL,要源码的可以找我,我可以发你。
原文链接:http://www.cnblogs.com/sam251/archive/2011/09/15/oauth_tencent.html
【编辑推荐】