2010-10-04 27 views

Respuesta

6

Yahoo hace uso de OAuth 1.0, por lo que me di cuenta de cómo hacerlo de forma manual:

En primer lugar, trato de utilizar el token he guardado en mi base de datos. Si recibo un error 401 no autorizado, llamo a mi método RefreshYahooAccessToken() y vuelvo a intentarlo.

Nota: Tengo mi propia implementación de un TokenManager que almacena mis tokens de acceso en una base de datos, así como cualquier dato adicional asociado con el token (YahooGUID y oauth_session_handle) que se me da en los parámetros de respuesta get_token de Yahoo. pero puede modificarlo fácilmente para que funcione con una implementación diferente de TokenManager.

aquí está mi versión de trabajo:

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

Si está hablando de OAuth 1.0 (a), no creo que la renovación de los tokens de acceso caducados sea parte de la especificación, así que sospecho que no puede hacerlo independientemente de la biblioteca OAuth que utilice .

Si está hablando de OAuth 2.0, entonces sí, el método ClientBase.RefreshToken lo hará por usted. DotNetOpenAuth incluso renueva automáticamente los tokens caducados cuando llama al ClientBase.AuthorizeRequest.

Cuestiones relacionadas