C# DotNetOpenAuth是否支持刷新过期的访问令牌?

C# DotNetOpenAuth是否支持刷新过期的访问令牌?,c#,oauth,dotnetopenauth,C#,Oauth,Dotnetopenauth,我找不到任何使用DotNetOpenAuth刷新过期访问令牌的示例。大多数提供商不使用过期代币,然而雅虎是一个大的提供商,他们的代币在一小时内过期 谢谢 如果您谈论的是OAuth 1.0(a),我认为更新过期的访问令牌根本不是规范的一部分,因此我怀疑您无法做到这一点,不管您使用的是什么OAuth库 如果您正在谈论OAuth2.0,那么是的,ClientBase.refreshtToken方法将为您完成这项工作。DotNetOpenAuth甚至在您调用ClientBase时自动更新几乎过期的令牌。

我找不到任何使用DotNetOpenAuth刷新过期访问令牌的示例。大多数提供商不使用过期代币,然而雅虎是一个大的提供商,他们的代币在一小时内过期


谢谢

如果您谈论的是OAuth 1.0(a),我认为更新过期的访问令牌根本不是规范的一部分,因此我怀疑您无法做到这一点,不管您使用的是什么OAuth库


如果您正在谈论OAuth2.0,那么是的,
ClientBase.refreshtToken
方法将为您完成这项工作。DotNetOpenAuth甚至在您调用
ClientBase时自动更新几乎过期的令牌。AuthorizationRequest

Yahoo确实使用OAuth 1.0,因此我想出了手动执行的方法:

首先,我尝试使用保存在数据库中的令牌。如果出现401未经授权的错误,我将调用我的RefreshyHooAccessToken()方法,然后重试

注意:我有自己的令牌管理器实现,它将我的访问令牌存储在数据库中,以及与令牌(YahooGUID和oauth_session_handle)相关的任何额外数据,这些数据是在Yahoo的get_令牌响应参数中提供给我的,但是您可以轻松地修改它以使用不同的令牌管理器实现

以下是我的工作版本:

try
{
    request = yahoo.PrepareAuthorizedRequest(YahooContactsAPIEndpoint, TokenManager.currentToken.Token, extraData);
    response = yahoo.Channel.WebRequestHandler.GetResponse(request);
    body = response.GetResponseReader().ReadToEnd();
}
catch (DotNetOpenAuth.Messaging.ProtocolException ex)
{
    //is token expired?
    if (ex.InnerException is WebException
        && ((WebException)ex.InnerException).Response is HttpWebResponse
        && ((HttpWebResponse)((WebException)ex.InnerException).Response).StatusCode == HttpStatusCode.Unauthorized)
    {
        RefreshYahooAccessToken();
        request = yahoo.PrepareAuthorizedRequest(YahooContactsAPIEndpoint, TokenManager.currentToken.Token, extraData);
        response = yahoo.Channel.WebRequestHandler.GetResponse(request);
        body = response.GetResponseReader().ReadToEnd();
    }
}


private static void RefreshYahooAccessToken()
{
    var request = (HttpWebRequest)WebRequest
        .Create("https://api.login.yahoo.com/oauth/v2/get_token"
            + "?oauth_consumer_key=" + TokenManager.ConsumerKey
            + "&oauth_nonce=" + (new Random()).Next(123400, 9999999).ToString()
            + "&oauth_session_handle=" + TokenManager.GetExtraData("oauth_session_handle") //this value is given to you in the get_token Response Parameters
            + "&oauth_signature=" + TokenManager.ConsumerSecret + "%26" + TokenManager.currentToken.Secret
            + "&oauth_signature_method=PLAINTEXT"
            + "&oauth_timestamp=" + (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds.ToString().Split(new char[] { '.' })[0]
            + "&oauth_token=" + TokenManager.currentToken.Token
            + "&oauth_version=1.0");
    try
    {
        var response = (HttpWebResponse)request.GetResponse();
        var returnStr = new System.IO.StreamReader(response.GetResponseStream()).ReadToEnd();
        var returnData = System.Web.HttpUtility.ParseQueryString(returnStr ?? string.Empty);
        TokenManager.ExpireRequestTokenAndStoreNewAccessToken(null, null, returnData["oauth_token"], returnData["oauth_token_secret"]);
    }
    catch (Exception)
    {
        //User probably revoked token.  Clear the current token, and request authorization again
    }
}