騰訊開(kāi)放平臺(tái)中實(shí)現(xiàn)QQ登陸的功能
這昨天為自己的網(wǎng)站實(shí)現(xiàn)了QQ登陸的功能,雖然,沒(méi)有進(jìn)行綁定,但是在技術(shù)層面上來(lái)說(shuō),已經(jīng)了解了一點(diǎn)騰訊開(kāi)放平臺(tái)的協(xié)議。
具體什么是OAUTH,請(qǐng)您GG一下吧...
關(guān)于騰訊的開(kāi)放平臺(tái),最主要的就是參數(shù)一定不能多,能有的要有,不能有的一定不能有.不然提交過(guò)去,就會(huì)提示什么什么錯(cuò)了。
最關(guān)鍵的就是簽名的方式,下面就是我的簽名的代碼:
- /// <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是在構(gòu)造方式里進(jìn)行賦值,或者其它地方,簽名里最關(guān)鍵的,就是oauth_signature和timestamp這兩個(gè)參數(shù),要記得去掉,在這里,我選擇了過(guò)濾。
因?yàn)橛械臅r(shí)候,CurrentStepParameters這個(gè)字典從querystring來(lái)生成的話會(huì)簡(jiǎn)單點(diǎn)還有能復(fù)用。
在所有參數(shù)中,有幾個(gè)是經(jīng)常會(huì)用到的。
所以,在此我建立了一個(gè)通用參數(shù)生成方法。
- protected virtual void AddCommonParameters()
- {
- if (this.CurrentStepParameters != null)
- {
- //增加通用參數(shù)
- 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);
- }
- }
- }
下面是一個(gè)測(cè)試地址:http://www.changshu.so/Tencent ,之后等完成綁定后,地址會(huì)刪除。
組件下載地址:http://files.cnblogs.com/sam251/CSCMS.Secrity.OAuth.rar
后續(xù)還有綁定的需要自己去實(shí)現(xiàn)了。如果能有通用的方式,我會(huì)定時(shí)更新,另外,其它OAUTH,比如SINA的,正在研究。
本程序里的OAuthHelper.GenerateTimestamp()及OAuthHelper.UrlEncode都是來(lái)自網(wǎng)上其它朋友的方法。
源不源碼也沒(méi)有什么重要了。因?yàn)檎显谧约旱木W(wǎng)站里,所以,只是給出了一個(gè)DLL,要源碼的可以找我,我可以發(fā)你。
原文鏈接:http://www.cnblogs.com/sam251/archive/2011/09/15/oauth_tencent.html
【編輯推薦】