Мы написали программное обеспечение более 1 года назад для синхронизации событий из календарей Google. Он работает с марта 2018 года, но неожиданно перестанет работать в этом месяце на всех экземплярах Gsuite, которые мы используем для нас и для наших клиентов.
Проблема в том, что мы используем служебную учетную запись для доступа к событиям ресурсов календаря через google CalendarAPI v3.
После аутентификации с использованием учетных данных учетной записи службы для каждого вызова службы мы теперь сталкиваемся с ошибкой:
"Ошибка: \" invalid_request \ ", Описание: \" Принципал должен быть адресом электронной почты \ ", Uri: \" \ ""
Я нигде не могу найти ответ об этой проблеме, это похоже на изменение политики в службе Google, но я не уверен в этом.
Похоже, что Google API жалуется на электронную почту учетной записи службы, которая на самом деле не является действительной электронной почтой. Именно в этом формате:
mydomain.com_ (client_id) 313 ....... @ resource.calendar.google.com
Как вы думаете, проблема может быть связана с адресом электронной почты учетной записи службы?
И почему он работал до апреля, а теперь перестал работать?
Одно из возможных решений, еще не опробованное:
Я считаю, что можно использовать «делегирование» для учетной записи службы.
Что произойдет, если я попытаюсь использовать действительный адрес электронной почты пользователя и передать его моей учетной записи службы?
/* function I use to authenticate my service account to Google Calendar
* service. serviceAccount is the email (Principal not working?) and json is
* the key generated for him.
*/
public void bindCalendarService(string json, string serviceAccount)
{
var cr = Newtonsoft.Json.JsonConvert.DeserializeObject<PersonalServiceAccountCred>(json);
ServiceAccountCredential xCred = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(cr.client_id, cr.token_uri)
{
Scopes = new string[] {
CalendarService.Scope.Calendar,
},
User = serviceAccount
}.FromPrivateKey(cr.private_key));
CalendarService calendarService = new CalendarService(new BaseClientService.Initializer()
{
HttpClientInitializer = xCred
});
this.calendarService = calendarService;
}