2013-12-12 3 views
0

Я пытаюсь написать программу, которая будет синхронизировать события между CRM и Google Calendar нескольких учетных записей Google..NET API календаря Google v3: аутентификация mutilple учетной записи

Это приложение Windows Console.

Для каждой учетной записи Google в Консоли API я включил API календаря, создал приложение с именем «UpdateSync» (введите: native), а затем загрузил файл JSON.

я переименовал эти файлы с помощью учетной записи электронной почты (т.е. [email protected])

Далее, я написал код ниже:

/// <summary> 
    /// Loads updated event from Google Calender after last synchonization date 
    /// </summary> 
    /// <param name="user">The user we want to get appointments</param> 
    public List<Appointment> LoadAppointments(User user) 
    { 
     Console.WriteLine("LoadAppointments({0})", user.Email); 
     List<Appointment> Appointments = new List<Appointment>(); 

     UserCredential credential; 
     using (var stream = new FileStream(string.Format("credentials\\{0}.json", user.Email), FileMode.Open, FileAccess.Read)) 
     { 
      try 
      { 
       credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets, new[] { CalendarService.Scope.Calendar }, "user", CancellationToken.None, new FileDataStore("UpdayeSync.Credentials")).Result; 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
       return null; 
      } 
     } 

     BaseClientService.Initializer initializer = new BaseClientService.Initializer(); 
     initializer.HttpClientInitializer = credential; 
     initializer.ApplicationName = "UpdateSync"; 
     service = new CalendarService(initializer); 

     EventsResource.ListRequest req = service.Events.List("primary"); 
     req.TimeMin = DateTime.Now.AddMonths(-2).ToString("o"); 
     req.ShowDeleted = true; 
     req.UpdatedMin = XmlConvert.ToString(LastSync, XmlDateTimeSerializationMode.Utc); 
     req.SingleEvents = true; 

     Events events; 
     try 
     { 
      events = req.Execute(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
      return null; 
     } 

     // [...] 
    } 

Этот код называется для каждого файла JSON ,

При первом вызове учетная запись для синхронизации была «[email protected]». Google Chrome автоматически отключился и автоматически зарегистрировался с моей учетной записью ([email protected]) и попросил, чтобы моя программа получила доступ к API календаря.

Я принимаю.

Это всплывающее окно больше не отображается.

Любые изменения, внесенные для любой учетной записи, были выполнены в моем собственном календаре, а не в файле JSON.

Что случилось? Как получить доступ к нескольким учетным записям Google с помощью уникальной программы?

Эта программа будет запускаться на сервере в качестве запланированной задачи, и я не должен открывать какое-либо окно, так как никто не будет смотреть на экран сервера. Я не могу попросить пользователя аутентифицировать себя, так как нет пользователя.

Но я могу сделать что-нибудь на счет Google любого из пользователей (включение API, создание ключей, предоставление приложения и т.д.)

ответ

2

Вы должны создать новый CalendarService (легкий компонент) для каждого пользователя. Услуга CalendarService и все другие сервисы Google реализованы как непреложные (для простоты и поддержки потокобезопасных операций).

Создайте новый сервис для каждого пользователя и используйте другой userId («user1», «user2» и т. Д.) В качестве параметра для GoogleWebAuthorizationBroker.AuthorizeAsync.

UPDATE:

Вы должны также создать свой собственный класс потока:

class ForceUIGoogleAuthorizationCodeFlow : AuthorizationCodeFlow 
{ 
    public override AuthorizationCodeRequestUrl CreateAuthorizationCodeRequest(string redirectUri) 
    { 
     return new GoogleAuthorizationCodeRequestUrl(new Uri(AuthorizationServerUrl)) 
     { 
      ClientId = ClientSecrets.ClientId, 
      Scope = string.Join(" ", Scopes), 
      RedirectUri = redirectUri, 
      ApprovalPrompt = "force", 
     }; 
    } 
} 

, а затем,

заменить ваш вызов GoogleWebAuthorizationBroker со следующим кодом:

var initializer = new GoogleAuthorizationCodeFlow.Initializer 
{ 
     ClientSecrets = clientSecrets, 
     Scopes = [SCOPED_HERE]; 
     initializer.DataStore = new FileDataStore("Credentials"); 
}; 
var flow = new ForceUIGoogleAuthorizationCodeFlow(initializer); 
// Create authorization code installed app instance and authorize the user. 
crdentials = await new AuthorizationCodeInstalledApp(flow, 
     new LocalServerCodeReceiver()).AuthorizeAsync 
     ("USER_ID_HERE", taskCancellationToken).ConfigureAwait(false); 
+0

Hello. Насколько я знаю, это то, что я сделал: у меня есть класс «GoogleExtractor» с методом Load (источник, подобный приведенному выше).Затем у меня есть еще один класс, который запускает объекты GoogleExtractor в цикле, по одному на каждого пользователя. Я попытался заменить константу «user» в вызове GoogleWebAuthorizationBroker.AuthorizeAsync() по имени пользователя (адрес GMail), но это ничего не меняет: я всегда подключаюсь к аккаунту Google, с которым связан Google Chrome, даже если эта учетная запись не должна вызываться моей программой. – StringBuilder

+0

@ StringBuilder. Лучше использовать SDK для клиентов Google, где не требуется никакого генерации ключей api. –

+0

Не подходит для использования GoogleWebAuthorizationBroker. Проблема в том, что когда я войду в Google в браузере, даже указав другой идентификатор пользователя/адрес электронной почты, браузер просто представляет экран согласия для моей учетной записи. Нет подсказки для указанной учетной записи. Для календарей единственным решением является использование учетных записей служб и совместное использование календаря с учетной записью службы (что справедливо в том, что рекомендует Google) – tjmoore

Смежные вопросы