API вызова Call Calendar: принципалом должен быть адрес электронной почты - PullRequest
1 голос
/ 24 апреля 2019

Мы написали программное обеспечение более 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;
    }

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Я сегодня решаю проблему другим путем.

1) Я пытался реализовать делегирование, как это описано в: https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority Это работает.

2) Без делегирования я изменил свой метод, опубликованный в avove следующим образом:

var credentialParameters = NewtonsoftJsonSerializer.Instance.Deserialize (json);

        ServiceAccountCredential xCred = new ServiceAccountCredential(
            new ServiceAccountCredential.Initializer(**credentialParameters.ClientEmail**)
            {
                Scopes = new string[] {
                    CalendarService.Scope.Calendar
                },
                User = serviceAccount,         // service account's email
            }.FromPrivateKey(credentialParameters.PrivateKey));

Это работает даже таким образом. Все еще остается загадкой, почему вышеуказанный код перестал работать через 1 год.

Надеюсь, это кому-нибудь поможет Спасибо

0 голосов
/ 24 апреля 2019

вам нужно предоставить доступ к незащищенным приложениям в безопасности аккаунта Google, попробуйте это: https://support.google.com/accounts/answer/6010255?hl=en, если оно не работает, поговорите со мной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...