Я пытаюсь написать программу, которая будет синхронизировать события между 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, создание ключей, предоставление приложения и т.д.)
Hello. Насколько я знаю, это то, что я сделал: у меня есть класс «GoogleExtractor» с методом Load (источник, подобный приведенному выше).Затем у меня есть еще один класс, который запускает объекты GoogleExtractor в цикле, по одному на каждого пользователя. Я попытался заменить константу «user» в вызове GoogleWebAuthorizationBroker.AuthorizeAsync() по имени пользователя (адрес GMail), но это ничего не меняет: я всегда подключаюсь к аккаунту Google, с которым связан Google Chrome, даже если эта учетная запись не должна вызываться моей программой. – StringBuilder
@ StringBuilder. Лучше использовать SDK для клиентов Google, где не требуется никакого генерации ключей api. –
Не подходит для использования GoogleWebAuthorizationBroker. Проблема в том, что когда я войду в Google в браузере, даже указав другой идентификатор пользователя/адрес электронной почты, браузер просто представляет экран согласия для моей учетной записи. Нет подсказки для указанной учетной записи. Для календарей единственным решением является использование учетных записей служб и совместное использование календаря с учетной записью службы (что справедливо в том, что рекомендует Google) – tjmoore