騰訊開放平臺中實現QQ登陸的功能
這昨天為自己的網站實現了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
【編輯推薦】