2010-10-04 7 views
6

मुझे पर DotNetOpenAuth का उपयोग करने का कोई उदाहरण नहीं मिल रहा है, एक कालबाह्य एक्सेस टोकन रीफ्रेश करें। अधिकांश प्रदाता टोकरी की समाप्ति का उपयोग नहीं करते हैं, हालांकि याहू एक बड़ा है जो एक घंटे में अपने टोकन की अवधि समाप्त करता है।क्या DotNetOpenAuth समर्थन रीफ्रेशिंग समाप्त हो चुके एक्सेस टोकन?

धन्यवाद!

उत्तर

6

याहू OAuth 1.0 का उपयोग करता है, तो मैं पता लगा मैन्युअल यह करने के लिए:

पहले, मैं टोकन मैं अपने डेटाबेस में बचाया है उपयोग करने के लिए प्रयास करें। अगर मुझे 401 अनधिकृत त्रुटि मिलती है, तो मैं अपने RefreshYahooAccessToken() विधि को कॉल करता हूं, और पुनः प्रयास करता हूं।

नोट: मेरे पास टोकन मैनेजर का अपना कार्यान्वयन है जो डेटाबेस में मेरे एक्सेस टोकन को स्टोर करता है, साथ ही साथ टोकन (याहूली, और oauth_session_handle) से जुड़े किसी भी अतिरिक्त डेटा को जो मुझे याहू के get_token प्रतिक्रिया पैरामीटर्स में दिया जाता है, लेकिन आप इसे एक अलग टोकन मैनेजर कार्यान्वयन के साथ काम करने के लिए आसानी से संशोधित कर सकते हैं।

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

यदि आप ओएथ 1.0 (ए) के बारे में बात कर रहे हैं, तो मुझे विश्वास नहीं है कि समय-समय पर समाप्त होने वाली एक्सेस टोकन नवीनीकरण का हिस्सा है, इसलिए मुझे संदेह है कि आप ओएथ लाइब्रेरी का उपयोग करने के बावजूद इसे नहीं कर सकते ।

यदि आप ओएथ 2.0 के बारे में बात कर रहे हैं, तो हाँ ClientBase.RefreshToken विधि आपके लिए यह करेगी। जब आप ClientBase.AuthorizeRequest पर कॉल करते हैं तो DotNetOpenAuth स्वचालित रूप से लगभग समाप्त हो चुके टोकन को नवीनीकृत करता है।

संबंधित मुद्दे