2012-07-12 8 views
7

मेरे पास एक .NET एप्लिकेशन है जो उपयोगकर्ता की फ़ाइल तक पहुंचने के लिए Google ड्राइव का उपयोग कर रहा है। मैं प्राधिकरण कोड प्राप्त करने में सक्षम हूं, और मैं AccessToken और RefreshToken द्वारा प्राधिकरण कोड का आदान-प्रदान करने में सक्षम हूं। मुद्दा यह है कि मैं एक्सेस टोकन रीफ्रेश नहीं कर सकता, और यह एक घंटे के बाद समाप्त हो जाता है।.NET में Google ड्राइव एसडीके के माध्यम से रीफ्रेश टोकन का उपयोग करके एक्सेस टोकन कैसे उत्पन्न करें?

इस प्रश्न के समान: How to generate access token using refresh token through google drive API? सिवाय इसके कि मैं .NET में काम कर रहा हूं (Google.APIs ... DLLs का उपयोग कर)।

मुझे इस बारे में पता है: https://developers.google.com/accounts/docs/OAuth2InstalledApp#refresh हालांकि, मुझे IAuthorizationState या OAuth2Authenticator ऑब्जेक्ट में उपलब्ध कुछ प्रकार की विधि की उम्मीद है ताकि मुझे एक्सेस टोकन रीफ्रेश करने की अनुमति मिल सके।

कृपया सलाह दें। धन्यवाद।

कृपया ध्यान दें कि इस कोड का उपयोग करके मैं एक्सेस टोकन प्राप्त करने में सक्षम हूं। यह सिर्फ इतना है कि मैं इस कोड को Google एपीआई के अंदर होने की उम्मीद कर रहा हूं।

public class OAuth2AccessTokenReponse 
    { 
     public string access_token; 
     public int expires_in; 
     public string token_type; 
    } 
    public static string refreshAccessToken() 
    { 
     using (System.Net.WebClient client = new System.Net.WebClient()) 
     { 
      byte[] response = client.UploadValues("https://accounts.google.com/o/oauth2/token", new System.Collections.Specialized.NameValueCollection(){ 
       {"client_id", ClientID}, 
       {"client_secret", ClientSecret}, 
       {"refresh_token", "XXXXX"}, 
       {"grant_type", "refresh_token"} 
      }); 
      string sresponse = System.Text.Encoding.Default.GetString(response); 
      OAuth2AccessTokenReponse o = (OAuth2AccessTokenReponse) Newtonsoft.Json.JsonConvert.DeserializeObject(sresponse, typeof(OAuth2AccessTokenReponse)); 
      return o.access_token;   
     } 
    } 

उत्तर

8

मैंने एक और अधिक उपयुक्त नमूना का अध्ययन किया: GoogleApisSample के कार्य। WinForms.NoteMgr ... और इसके साथ मुझे समाधान मिला।

समाधान नीचे दिए गए कोड में है। इसका मुख्य भाग तर्क पर कॉल कर रहा है। रीफ्रेश टोकन (राज्य);

धन्यवाद।

public static Authentication.IAuthenticator UseSavedAuthorization() 
    {   

     var provider = new NativeApplicationClient(GoogleAuthenticationServer.Description); 
     provider.ClientIdentifier = ClientID; 
     provider.ClientSecret = ClientSecret; 

     OAuth2Authenticator<NativeApplicationClient> auth = new OAuth2Authenticator<NativeApplicationClient>(provider, getState); 

     auth.LoadAccessToken(); 

     return auth;    
    } 


public static IAuthorizationState getState(NativeApplicationClient arg) 
    { 
     IAuthorizationState state = new AuthorizationState(new[] { TasksService.Scopes.Tasks.GetStringValue(), 
       DriveService.Scopes.DriveFile.GetStringValue() , DriveService.Scopes.Drive.GetStringValue() 
     }); 
     state.Callback = new Uri(NativeApplicationClient.OutOfBandCallbackUrl); 

     state.RefreshToken = "<refresh token previously saved>";   
     arg.RefreshToken(state); 

     return state; 
    }` 
0

आप नेट क्लाइंट लाइब्रेरी (http://code.google.com/p/google-api-dotnet-client/) का उपयोग कर रहे हैं, तो आप इस बात का ध्यान रखना नहीं है। आपके द्वारा पहली बार पुनर्प्राप्त रीफ्रेश टोकन का उपयोग करते समय लाइब्रेरी स्वचालित रूप से आपके लिए एक नई पहुंच टोकन का अनुरोध करेगी।

+0

मैं पुस्तकालय का उपयोग कर रहा हूं। मेरा प्रोजेक्ट एक "स्थापित अनुप्रयोग" है। मेरे परीक्षण में यह काम नहीं किया। मैं एप्लिकेशन को पहली बार एक्सेस करने में सक्षम था (उस समय के दौरान मेरे ऐप को खोलना/बंद करना)। इस मुद्दे के कारण आवेदन के बाद आवेदन अस्वीकार कर दिया गया था। क्या आपके पास ऐसा करने का एक नमूना नमूना है? मैं कार्य का उपयोग कर रहा हूं। SimpleOAuth2 नमूना (निश्चित रूप से इसका विस्तार)। – rufo

+0

उपयोगकर्ता को पहली बार रीफ्रेश टोकन मिलता है जब उपयोगकर्ता आपके ऐप तक पहुंच प्रदान करता है ताकि आपको इसे भविष्य के उपयोग के लिए स्टोर करना होगा। मुझे लगता है कि आपने दूसरी बार ऐप की कोशिश की थी, आपने केवल एक एक्सेस टोकन पुनर्प्राप्त किया था (और कोई ताज़ा टोकन नहीं था) इसलिए इसकी समाप्ति के बाद नए एक्सेस टोकन का अनुरोध करने का कोई तरीका नहीं था। Google ड्राइव का एक पूर्ण नमूना है, लेकिन यह एक स्थापित ऐप नहीं है: https://developers.google.com/drive/examples/dotnet –

+0

क्लाउडियो, हाँ - मुझे पहली बार ताज़ा टोकन मिला और इसे सहेजा गया। अगली बार मैंने इसका उपयोग करने की कोशिश की (राज्य को सेट करके। रीफ्रेश टोकन = {मेरा रीफ्रेश टोकन}, और प्राधिकरण का उपयोग करना। लोडएसेप्ट टोकन()। यह काम नहीं किया। नोट: मैंने DrEdit.Net नमूना भी देखा और ऐसा लगता है मेरे लिए वे जो कर रहे हैं वह कर रहे हैं। कृपया ध्यान दें कि उपरोक्त कार्यों से मेरा वर्कअराउंड कोड (इसलिए मेरे पास सही ताज़ा ताज़ा है)। आपकी मदद के लिए धन्यवाद। – rufo

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