2010-10-04 29 views

Odpowiedz

6

Yahoo robi użyć OAuth 1.0, więc zorientowali się, jak to zrobić ręcznie:

Po pierwsze, staram się korzystać z tokena mam zapisany w mojej bazy danych. Jeśli otrzymam błąd 401 Nieautoryzowany, nazywam moją metodę RefreshYahooAccessToken() i spróbuj ponownie.

Uwaga: Mam własną implementację programu TokenManager, który przechowuje moje tokeny dostępu w bazie danych, a także wszelkie dodatkowe dane powiązane z tokenem (YahooGUID i oauth_session_handle), które są mi dane w parametrach odpowiedzi get_token Yahoo, ale możesz go łatwo zmodyfikować, aby działał z inną implementacją TokenManager.

Oto moja wersja robocza:

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

Jeśli mówisz o OAuth 1.0 (a), nie wierzę, że odnowienie przedawnionych tokenów dostępu jest częścią specyfikacji, więc podejrzewam, że po prostu nie możesz tego zrobić bez względu na używaną bibliotekę OAuth. .

Jeśli mówisz o OAuth 2.0, to tak, metoda ClientBase.RefreshToken zrobi to za ciebie. DotNetOpenAuth nawet automatycznie odnawia prawie wygasłe żetony, gdy zadzwonisz pod numer ClientBase.AuthorizeRequest.

Powiązane problemy