Поддерживает ли DotNetOpenAuth обновление маркеров с истекшим сроком доступа? - PullRequest
6 голосов
/ 04 октября 2010

Я не могу найти никаких примеров использования DotNetOpenAuth для обновления просроченного токена доступа .Большинство провайдеров не используют токены с истекающим сроком действия, однако Yahoo - это крупный продукт, срок действия которого истекает через один час.

Спасибо!

Ответы [ 2 ]

7 голосов
/ 10 октября 2010

Если вы говорите об OAuth 1.0 (a), я не думаю, что обновление маркеров доступа с истекшим сроком вообще является частью спецификации, поэтому я подозреваю, что вы просто не сможете сделать это независимо от используемой вами библиотеки OAuth.

Если вы говорите об OAuth 2.0, то да, метод ClientBase.RefreshToken сделает это за вас.DotNetOpenAuth даже автоматически обновляет токены с почти истекшим сроком действия при вызове ClientBase.AuthorizeRequest.

6 голосов
/ 20 октября 2010

Yahoo использует OAuth 1.0, поэтому я понял, как это сделать вручную:

Сначала я пытаюсь использовать токен, который я сохранил в своей базе данных.Если я получаю 401 несанкционированную ошибку, я вызываю свой метод RefreshYahooAccessToken () и повторяю попытку.

Примечание: у меня есть собственная реализация TokenManager, которая хранит мои маркеры доступа в базе данных, а также любые дополнительныеданные, связанные с токеном (YahooGUID и oauth_session_handle), который передается мне в параметрах ответа get_token Yahoo, но вы можете легко изменить его для работы с другой реализацией TokenManager.

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
    }
}
...