2015-06-19 9 views
5

मैं सी # में एक डेस्कटॉप एप्लिकेशन लिख रहा हूं जो कि Google Apps "खाते" पर सभी उपयोगकर्ताओं को प्रत्येक उपयोगकर्ता के लिए पुनर्प्राप्त कैलेंडर-ईवेंट तक पहुंचने में सक्षम होना चाहिए। मैंने अपने "प्रोजेक्ट" में कैलेंडर एपीआई और एडमिन एसडीके जोड़ा है।डेस्कटॉप एप्लिकेशन के लिए एकाधिक Google एक्सेस अनुमतियां

दोनों विधियां (नीचे) स्वयं पर ठीक काम करती हैं लेकिन जब मैं अपने एप को दोनों एपीआई के लिए अधिकृत करना चाहता हूं तो मुझे निम्नलिखित अनुमति त्रुटियां मिलती हैं।

अपर्याप्त अनुमति [403]

invalid_grant ", विवरण:" टोकन निरस्त कर दिया गया।

इससे मुझे आश्चर्य हुआ कि आवेदन शुरू होने पर सभी अनुमतियों के लिए पूछना संभव था, "सुविधाओं" को अलग से अधिकृत करने के बजाय?

static string[] CalendarScopes = {CalendarService.Scope.CalendarReadonly }; 
    static string[] DirectoryScopes = { DirectoryService.Scope.AdminDirectoryUserReadonly }; 

    private static void GoogleCalendar() 
    { 
     UserCredential credential; 

     using (var stream = new FileStream("client_secret.json", FileMode.Open, FileAccess.Read)) 
     { 
      string credPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); 
      credPath = Path.Combine(credPath, ".credentials"); 

      credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
       GoogleClientSecrets.Load(stream).Secrets, 
       CalendarScopes, 
       "user", 
       CancellationToken.None, 
       new FileDataStore(credPath, true)).Result; 
     } 

     // Create Google Calendar API service. 
     var service = new CalendarService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credential, 
      ApplicationName = ApplicationName, 
     }); 

     // Define parameters of request. 
     EventsResource.ListRequest request = service.Events.List("primary"); 
     request.TimeMin = DateTime.Now; 
     request.ShowDeleted = false; 
     request.SingleEvents = true; 
     //request.MaxResults = 10; 
     request.OrderBy = EventsResource.ListRequest.OrderByEnum.StartTime; 

     // List events. 
     Events events = request.Execute(); 
     Console.WriteLine("Upcoming events:"); 
     if (events.Items != null && events.Items.Count > 0) 
     { 
      foreach (var eventItem in events.Items) 
      { 
       string when = eventItem.Start.DateTime.ToString(); 
       if (String.IsNullOrEmpty(when)) 
       { 
        when = eventItem.Start.Date; 
       } 
       Console.WriteLine("{0} ({1})", eventItem.Summary, when); 
      } 
     } 
     else 
     { 
      Console.WriteLine("No upcoming events found."); 
     } 
     Console.Read(); 
    } 

    private static void GoogleDirectory() 
    { 
     UserCredential credential; 

     using (var stream = 
      new FileStream("client_secret.json", FileMode.Open, FileAccess.Read)) 
     { 
      string credPath = Environment.GetFolderPath(
       Environment.SpecialFolder.Personal); 
      credPath = Path.Combine(credPath, ".credentials"); 

      credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
       GoogleClientSecrets.Load(stream).Secrets, 
       DirectoryScopes, 
       "user", 
       CancellationToken.None, 
       new FileDataStore(credPath, true)).Result; 
      Console.WriteLine("Credential file saved to: " + credPath); 
     } 

     // Create Directory API service. 
     var service = new DirectoryService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credential, 
      ApplicationName = ApplicationName, 
     }); 

     // Define parameters of request. 
     UsersResource.ListRequest request = service.Users.List(); 
     request.Customer = "my_customer"; 
     request.MaxResults = 10; 
     request.OrderBy = UsersResource.ListRequest.OrderByEnum.Email; 

     // List users. 

     IList<User> users = null; 

     try 
     { 
      users = request.Execute().UsersValue; 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 


     Console.WriteLine("Users:"); 
     if (users != null && users.Count > 0) 
     { 
      foreach (var userItem in users) 
      { 
       Console.WriteLine("{0} ({1})", userItem.PrimaryEmail, 
        userItem.Name.FullName); 
      } 
     } 
     else 
     { 
      Console.WriteLine("No users found."); 
     } 
     Console.Read(); 
    } 
+1

आपको क्या त्रुटियां मिलती हैं? हां, आप अपने आवेदन के लिए आवश्यक सभी क्षेत्रों के साथ एक्सेस टोकन का अनुरोध कर सकते हैं। हालांकि इसकी अनुशंसा नहीं की जाती है। – Gerardo

+0

मैंने अपवादों के साथ अपना प्रश्न अपडेट किया है। एकाधिक स्कॉप्स के लिए एक्सेस टोकन का उपयोग करने की अनुशंसा क्यों नहीं की जाती है? –

उत्तर

0

यूरेका! मुझे पता चला, समस्या को हल करने के लिए, और यह वास्तव में काफी सरल था।

समाधान, तरीकों को "विलय" करने के लिए था। इसका मतलब यह था कि एक्सेस टोकन का उपयोग करके मुझे केवल एक बार प्रमाण-पत्र जांचना होगा। मैंने स्कोप-सरणी में निर्देशिका भी जोड़ा।

static string[] Scopes = { CalendarService.Scope.CalendarReadonly, DirectoryService.Scope.AdminDirectoryUserReadonly }; 

    private static void GoogleThis() 
    { 
     UserCredential credential; 

     using (var stream = new FileStream("client_secret.json", FileMode.Open, FileAccess.Read)) 
     { 
      string credPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); 
      credPath = Path.Combine(credPath, ".credentials"); 

      credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
       GoogleClientSecrets.Load(stream).Secrets, 
       Scopes, 
       "user", 
       CancellationToken.None, 
       new FileDataStore(credPath, true)).Result; 
     } 

     // Create Google Calendar API service. 
     var eventService = new CalendarService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credential, 
      ApplicationName = ApplicationName, 
     }); 

     // Define parameters of request. 
     EventsResource.ListRequest eventRequest = eventService.Events.List("primary"); 
     eventRequest.TimeMin = DateTime.Now; 
     eventRequest.ShowDeleted = false; 
     eventRequest.SingleEvents = true; 
     //request.MaxResults = 10; 
     eventRequest.OrderBy = EventsResource.ListRequest.OrderByEnum.StartTime; 

     // List events. 
     Events events = eventRequest.Execute(); 
     Console.WriteLine("Upcoming events:"); 
     if (events.Items != null && events.Items.Count > 0) 
     { 
      foreach (var eventItem in events.Items) 
      { 
       string when = eventItem.Start.DateTime.ToString(); 
       if (String.IsNullOrEmpty(when)) 
       { 
        when = eventItem.Start.Date; 
       } 
       Console.WriteLine("{0} ({1})", eventItem.Summary, when); 
      } 
     } 
     else 
     { 
      Console.WriteLine("No upcoming events found."); 
     } 
     // Create Directory API service. 
     var dirService = new DirectoryService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credential, 
      ApplicationName = ApplicationName, 
     }); 

     // Define parameters of request. 
     UsersResource.ListRequest dirRequest = dirService.Users.List(); 
     dirRequest.Customer = "my_customer"; 
     dirRequest.MaxResults = 10; 
     dirRequest.OrderBy = UsersResource.ListRequest.OrderByEnum.Email; 

     // List users. 
     IList<User> users = null; 
     try 
     { 
      users = dirRequest.Execute().UsersValue; 
      Console.WriteLine("Users:"); 
      if (users != null && users.Count > 0) 
      { 
       foreach (var userItem in users) 
       { 
        Console.WriteLine("{0} ({1})", userItem.PrimaryEmail, 
         userItem.Name.FullName); 
       } 
      } 
      else 
      { 
       Console.WriteLine("No users found."); 
      } 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 
    } 
संबंधित मुद्दे