刷新Yahoo的OAuth访问令牌时,oauth_problem = token_rejected

时间:2014-04-23 16:35:35

标签: c# oauth yahoo-api

我已经和Hammock一起完成了Oauth,我成功获得了访问令牌,访问令牌秘密和会话句柄,但现在我必须在令牌过期时获得refresh access token

我已经按照说明操作了,我尝试使用urldecode传递访问令牌而没有urldecode,但我无法获取令牌,我获得了

  

oauth_problem = token_rejected

更新:

这是我的代码:

            ##the call##
            var AccessTokenQuery = OAuthUtil.GetAccessTokenQueryRenewal(accessToken, session_handle, accessTokenSecret);
            AccessTokenQuery.RequestAsync(AppSettings.AccessTokenUri, null);
            AccessTokenQuery.QueryResponse += new EventHandler<WebQueryResponseEventArgs>(AccessTokenQuery_QueryResponse); 
     internal static OAuthWebQuery GetAccessTokenQueryRenewal(string oauth_token,string session_handle, string oauth_token_secret)               
    {
        var oauth = new OAuthWorkflow
        {
            AccessTokenUrl = AppSettings.AccessTokenUri,
            ConsumerKey = AppSettings.consumerKey,
            ConsumerSecret = AppSettings.consumerKeySecret,
            SignatureMethod = OAuthSignatureMethod.HmacSha1,         
            ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader,
            TokenSecret = oauth_token_secret,
            Token = oauth_token,               
            SessionHandle = session_handle,
            Version = AppSettings.oAuthVersion
        };
        var info = oauth.BuildAccessTokenInfo(WebMethod.Post);
        var objOAuthWebQuery = new OAuthWebQuery(info, false);           
        objOAuthWebQuery.HasElevatedPermissions = true;
        objOAuthWebQuery.SilverlightUserAgentHeader = "Hammock";
        return objOAuthWebQuery;
    }

 void AccessTokenQuery_QueryResponse(object sender, WebQueryResponseEventArgs e)
    {
        try
        {
            StreamReader reader = new StreamReader(e.Response);
            string strResponse = reader.ReadToEnd();
            var parameters = MainUtil.GetQueryParameters(strResponse);
            accessToken = parameters["oauth_token"];
            accessTokenSecret = parameters["oauth_token_secret"];
            session_handle = parameters["oauth_session_handle"];

            MainUtil.SetKeyValue<string>("AccessToken", accessToken);
            MainUtil.SetKeyValue<string>("AccessTokenSecret", accessTokenSecret);
            MainUtil.SetKeyValue<string>("SessionHandle", session_handle);


            userLoggedIn();
        }
        catch (Exception ex)
        {
            Dispatcher.BeginInvoke(() =>
            {
                MessageBox.Show(ex.Message);
            });
        }
    }

1 个答案:

答案 0 :(得分:0)

您可以尝试的快速可能性:您说您'尝试使用urldecode传递访问令牌'。你尝试过使用urlencode吗? Urldecode用于解码从Web调用返回的URL,编码是在传递给Web调用之前完成的。

另请注意,Oauth的编码方案与.NET默认编码中使用的编码方案略有不同。您可以轻松编写自己的编码例程,查看oauth规范了解详细信息。

例如:

    private string UrlEncode(string value)
    {
        string unreserved = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";
        StringBuilder result = new StringBuilder();

        foreach (char symbol in value)
        {
            if (unreserved.IndexOf(symbol) != -1)
                result.Append(symbol);
            else
                result.Append('%' + String.Format("{0:X2}", (int)symbol));
        }

        return result.ToString();
    }