2010-10-04 19 views

Antwort

6

Yahoo tut verwenden OAuth 1.0, so dass ich herausgefunden, wie es manuell zu tun:

Zuerst versuche ich, das Token zu verwenden, die ich in meiner Datenbank gespeichert haben. Wenn ich einen 401-nicht autorisierten Fehler erhalte, rufe ich meine RefreshYahooAccessToken() -Methode auf und versuche es erneut.

Hinweis: Ich habe meine eigene Implementierung eines TokenManagers, der meine Zugriffstoken in einer Datenbank speichert, sowie alle zusätzlichen Daten, die mit dem Token (YahooGUID und oauth_session_handle) verbunden sind, das mir in Yahoo get_token Response Parameters gegeben wird. Sie können es jedoch leicht so ändern, dass es mit einer anderen TokenManager-Implementierung funktioniert.

Hier ist meine Arbeitsversion:

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

Wenn Sie über OAuth 1.0 (a) sprechen, glaube ich nicht, dass das Aktualisieren von abgelaufenen Zugriffstoken überhaupt Teil der Spezifikation ist. Ich nehme an, dass Sie dies unabhängig von der verwendeten OAuth-Bibliothek nicht tun können .

Wenn Sie über OAuth 2.0 sprechen, dann wird ja die ClientBase.RefreshToken Methode für Sie tun. DotNetOpenAuth erneuert automatisch fast abgelaufene Token, wenn Sie ClientBase.AuthorizeRequest aufrufen.

Verwandte Themen