2010-10-04 24 views

Trả lời

6

Yahoo không sử dụng OAuth 1.0, vì vậy tôi đã tìm ra cách để làm điều đó bằng tay:

Trước tiên, tôi cố gắng sử dụng token Tôi đã lưu trong cơ sở dữ liệu của tôi. Nếu tôi gặp lỗi 401 trái phép, tôi gọi phương thức RefreshYahooAccessToken() và thử lại.

Lưu ý: Tôi đã thực hiện riêng TokenManager lưu trữ mã thông báo truy cập trong cơ sở dữ liệu, cũng như bất kỳ dữ liệu bổ sung nào liên quan đến mã thông báo (YahooGUID và oauth_session_handle) được cung cấp cho tôi trong các tham số trả lời get_token của Yahoo, nhưng bạn có thể dễ dàng sửa đổi nó để làm việc với một thực thi TokenManager khác.

Đây là phiên bản đang hoạt động của tôi:

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

Nếu bạn đang nói về OAuth 1.0 (a), tôi không tin rằng gia hạn mã thông báo truy cập đã hết hạn là một phần của thông số, vì vậy tôi nghi ngờ bạn không thể làm điều đó bất kể thư viện OAuth bạn sử dụng .

Nếu bạn đang nói về OAuth 2.0, thì có phương pháp ClientBase.RefreshToken sẽ làm điều đó cho bạn. DotNetOpenAuth thậm chí còn tự động gia hạn các mã thông báo đã hết hạn khi bạn gọi ClientBase.AuthorizeRequest.

Các vấn đề liên quan