简体   繁体   English

为Twitter WP7请求令牌

[英]Request Token for twitter wp7

I am building a twitter app for windows phone 7. But the twitter's OAuth is giving me a lot of problems. 我正在为Windows Phone 7构建一个Twitter应用程序。但是Twitter的OAuth给我带来了很多问题。 I am trying to get a Request Token and every single time I get the message: Failed to validate oauth signature and token. 我试图获取请求令牌,并且每次收到消息时:无法验证oauth签名和令牌。 Any help would be appreciated. 任何帮助,将不胜感激。

here is my code: 这是我的代码:

Parameters base string: 参数基本字符串:

public static string GetParameterString()
    {
        SystemParameters SysParameters = new SystemParameters();
        Parameters Param = new Parameters();
        StringBuilder sb = new StringBuilder();
        sb.Append(SysParameters.CallbackUrl()).Append("=");
        sb.Append(PercentEncoder(Param.callbackURL)).Append("&");
        sb.Append(SysParameters.CosumerToken()).Append("=");
        sb.Append(PercentEncoder(Param.consumerKey)).Append("&");
        sb.Append(SysParameters.Nonce()).Append("=");
        sb.Append(PercentEncoder(GetNonce())).Append("&");
        sb.Append(SysParameters.SignatureMethod()).Append("=");
        sb.Append(PercentEncoder("HMAC-SHA1")).Append("&");
        sb.Append(SysParameters.TimeStamp()).Append("=");
        sb.Append(PercentEncoder(GetTimeStamp().ToString())).Append("&");
        sb.Append(SysParameters.OauthVersion()).Append("=");
        sb.Append(PercentEncoder("1.0"));

        return sb.ToString();
    }

Signature Base string: 签名基本字符串:

public static string GetSignatureBase()
    {
        SystemParameters SysParameters = new SystemParameters();
        Parameters Param = new Parameters();
        StringBuilder sb = new StringBuilder();

        sb.Append("POST").Append("&");
        sb.Append(PercentEncoder(SysParameters.RequestTokenURL())).Append("&");
        sb.Append(PercentEncoder(GetParameterString()));

        return sb.ToString();
    }

Get signature: 获取签名:

public static string GetSignature()
{
   SystemParameters SysParameters = new SystemParameters();
   Parameters param = new Parameters();

   string signature;

   signature = Convert.ToBase64String((new HMACSHA1(Encoding.UTF8
                       .GetBytes(PercentEncoder(param.consumerSecret) + "&")))
                       .ComputeHash(Encoding.UTF8.GetBytes(GetSignatureBase())));

   return PercentEncoder(signature);      
 }

get token: 获取令牌:

private void button2_Click(object sender, RoutedEventArgs e)
    {
        StringBuilder sb = new StringBuilder();

        sb.Append(param.RequestURL)
                        .Append(OauthHelper.RequestType.RequesToken).Append("?");
        sb.Append(sysParam.CallbackUrl()).Append("=");
        sb.Append(OauthHelper.PercentEncoder(param.callbackURL)).Append("&");
        sb.Append(sysParam.CosumerToken()).Append("=");
        sb.Append(OauthHelper.PercentEncoder(param.consumerKey)).Append("&");
        sb.Append(sysParam.Nonce()).Append("=");
        sb.Append(OauthHelper.PercentEncoder(OauthHelper.GetNonce())).Append("&");
        sb.Append(sysParam.Signature()).Append("=");
        sb.Append(OauthHelper.PercentEncoder(OauthHelper.GetSignature())).Append("&");
        sb.Append(sysParam.SignatureMethod()).Append("=");
        sb.Append(OauthHelper.PercentEncoder("HMAC-SHA1")).Append("&");
        sb.Append(sysParam.TimeStamp()).Append("=");
        sb.Append(OauthHelper.PercentEncoder(OauthHelper.GetTimeStamp().ToString()))
                                                                        .Append("&");
        sb.Append(sysParam.OauthVersion()).Append("=");
        sb.Append(OauthHelper.PercentEncoder("1.0"));

        WebBrowserTask task = new WebBrowserTask();
        task.URL = sb.ToString();

        task.Show();

    }

I have done this implementation referring another code.. my code goes something like this.. 我已经参考另一个代码完成了此实现。我的代码是这样的。

#region web query response methods
    /// <summary>
    /// Event that initiates QueryResponse for RequestToken request
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e">Webresponse event argument</param>
    void requestTokenQuery_QueryResponse(object sender, WebQueryResponseEventArgs e)
    {
        try
        {
            var parameters = TwitterHelperMethods.GetQueryParameters(e.Response);
            OAuthTokenKey = parameters["oauth_token"];
            tokenSecret = parameters["oauth_token_secret"];
            var authorizeUrl = TwitterSettings.AuthorizeUri + "?oauth_token=" + OAuthTokenKey;

            Dispatcher.BeginInvoke(() =>
            {
                this.browseTwitter.Navigate(new Uri(authorizeUrl));
            });
        }
        catch (Exception ex)
        {
            Dispatcher.BeginInvoke(() =>
            {
                MessageBox.Show(ex.Message);
            });
        }
    }

    /// <summary>
    /// Event that initiates QueryResponse for AccessToken request
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e">Webresponse event argument</param>
    void AccessTokenQuery_QueryResponse(object sender, WebQueryResponseEventArgs e)
    {
        try
        {
            var parameters = TwitterHelperMethods.GetQueryParameters(e.Response);
            accessToken = parameters["oauth_token"];
            accessTokenSecret = parameters["oauth_token_secret"];
            userID = parameters["user_id"];
            userScreenName = parameters["screen_name"];

            TwitterHelperMethods.SetKeyValue<string>("AccessToken", accessToken);
            TwitterHelperMethods.SetKeyValue<string>("AccessTokenSecret", accessTokenSecret);
            TwitterHelperMethods.SetKeyValue<string>("ScreenName", userScreenName);

            cacheManager.SaveToIsolatedStorage(Utilities.TwitterID, userID);
            cacheManager.SaveToIsolatedStorage(Utilities.TwitterAccessToken, accessToken);
            cacheManager.SaveToIsolatedStorage(Utilities.TwitterSecretAccessToken, accessTokenSecret);
            // NavigationService.Navigate(new Uri("/HomePage.xaml", UriKind.RelativeOrAbsolute));
        }
        catch (Exception ex)
        {
            Dispatcher.BeginInvoke(() =>
            {
                MessageBox.Show(ex.Message);
            });
        }
    }
    #endregion

    #region Browser events methods

    /// <summary>
    /// Called after the broswer is loaded
    /// </summary>
    /// <param name="sender">Browser</param>
    /// <param name="e">Routed Event arguments</param>
    private void browseTwitter_Loaded(object sender, RoutedEventArgs e)
    {
        accessToken = TwitterHelperMethods.GetKeyValue<string>("AccessToken");
        accessTokenSecret = TwitterHelperMethods.GetKeyValue<string>("AccessTokenSecret");
        userScreenName = TwitterHelperMethods.GetKeyValue<string>("ScreenName");

        if (string.IsNullOrEmpty(accessToken) || string.IsNullOrEmpty(accessTokenSecret))
        {
            var requestTokenQuery = TwitterOAuthHelper.GetRequestTokenQuery();
            requestTokenQuery.RequestAsync(TwitterSettings.RequestTokenUri, null);
            requestTokenQuery.QueryResponse += new EventHandler<WebQueryResponseEventArgs>(requestTokenQuery_QueryResponse);
        }
    }

    /// <summary>
    /// Called when browser Initiates Navigation to Uri provided
    /// </summary>
    /// <param name="sender">Browser</param>
    /// <param name="e">Navigating event arguments</param>
    private void browseTwitter_Navigating(object sender, NavigatingEventArgs e)
    {
        if (e.Uri.ToString().StartsWith(TwitterSettings.CallbackUri))
        {
            cacheManager = new CacheManager();
            var AuthorizeResult = TwitterHelperMethods.GetQueryParameters(e.Uri.ToString());
            var VerifyPin = AuthorizeResult["oauth_verifier"];

            //We now have the Verification pin
            //Using the request token and verification pin to request for Access tokens

            var AccessTokenQuery = TwitterOAuthHelper.GetAccessTokenQuery(
                                                                     OAuthTokenKey,     //The request Token
                                                                     tokenSecret,       //The request Token Secret
                                                                     VerifyPin         // Verification Pin
                                                                    );
            AccessTokenQuery.QueryResponse += new EventHandler<WebQueryResponseEventArgs>(AccessTokenQuery_QueryResponse);
            AccessTokenQuery.RequestAsync(TwitterSettings.AccessTokenUri, null);
            NavigationService.Navigate(new Uri("/OtherPages/HomePage.xaml", UriKind.RelativeOrAbsolute));
        }
    }
    #endregion

My Twitterhelpermethods class goes like this 我的Twitterhelpermethods类是这样的

public class TwitterHelperMethods
{
    public static Dictionary<string, string> GetQueryParameters(string response)
    {
        Dictionary<string, string> nameValueCollection = new Dictionary<string, string>();
        string[] items = response.Split('&');

        foreach (string item in items)
        {
            if (item.Contains("="))
            {
                string[] nameValue = item.Split('=');
                if (nameValue[0].Contains("?"))
                    nameValue[0] = nameValue[0].Replace("?", "");
                nameValueCollection.Add(nameValue[0], System.Net.HttpUtility.UrlDecode(nameValue[1]));
            }
        }
        return nameValueCollection;
    }
}

and twitteroauthhelper.cs is 和twitteroauthhelper.cs是

public class TwitterOAuthHelper
{
    public static OAuthWebQuery GetRequestTokenQuery()
    {
        var oauth = new OAuthWorkflow
        {
            ConsumerKey = TwitterSettings.consumerKey,
            ConsumerSecret = TwitterSettings.consumerKeySecret,
            SignatureMethod = OAuthSignatureMethod.HmacSha1,
            ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader,
            RequestTokenUrl = TwitterSettings.RequestTokenUri,
            Version = TwitterSettings.oAuthVersion,
            CallbackUrl = TwitterSettings.CallbackUri
        };

        var info = oauth.BuildRequestTokenInfo(WebMethod.Get);
        var objOAuthWebQuery = new OAuthWebQuery(info);
        objOAuthWebQuery.HasElevatedPermissions = true;
        objOAuthWebQuery.SilverlightUserAgentHeader = "Hammock";
        objOAuthWebQuery.SilverlightMethodHeader = "GET";
        return objOAuthWebQuery;
    }

    public static OAuthWebQuery GetAccessTokenQuery(string requestToken, string RequestTokenSecret, string oAuthVerificationPin)
    {
        var oauth = new OAuthWorkflow
        {
            AccessTokenUrl = TwitterSettings.AccessTokenUri,
            ConsumerKey = TwitterSettings.consumerKey,
            ConsumerSecret = TwitterSettings.consumerKeySecret,
            ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader,
            SignatureMethod = OAuthSignatureMethod.HmacSha1,
            Token = requestToken,
            Verifier = oAuthVerificationPin,
            Version = TwitterSettings.oAuthVersion
        };

        var info = oauth.BuildAccessTokenInfo(WebMethod.Post);
        var objOAuthWebQuery = new OAuthWebQuery(info);
        objOAuthWebQuery.HasElevatedPermissions = true;
        objOAuthWebQuery.SilverlightUserAgentHeader = "Hammock";
        objOAuthWebQuery.SilverlightMethodHeader = "GET";
        return objOAuthWebQuery;
    }
}

twittersettings.cs :- twittersettings.cs:-

public class TwitterSettings
{
    public static string RequestTokenUri = "https://api.twitter.com/oauth/request_token";
    public static string AuthorizeUri = "https://api.twitter.com/oauth/authorize";
    public static string AccessTokenUri = "https://api.twitter.com/oauth/access_token";

    public static string CallbackUri = "http://www.qwinixtech.com";

    public static string StatusUpdateUrl { get { return "http://api.twitter.com"; } }

    // #error TODO REGISTER YOUR APP WITH TWITTER TO GET YOUR KEYS AND FILL THEM IN HERE
    public static string consumerKey = "Your consumer key here";
    public static string consumerKeySecret = "Your consumer secret key here";

    public static string AccessToken = "Your access token here";
    public static string AccessTokenSecret = "Your Secret access token here";

    public static string oAuthVersion = "1.0a";

}

This works perfectly well.. all u need to make this work is Hammock library.. I hope u already have it.. else pls download it.. 这工作得很好..您要做的所有工作就是Hammock库..我希望您已经拥有它..其他请下载它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM