Google Contacts API с проблемой сервисного аккаунта

Итак, у меня в основном это работает, за исключением одной проблемы. У меня настроена учетная запись службы Google, чтобы она могла получить доступ к контактам нашего домена. И он может запросить их идеально!

Но если я вызову cr.Retrieve("some-contact-url-here"), он выдаст ошибку, связанную с отсутствием токена Refresh. Однако я использую учетную запись службы, поэтому при аутентификации я не получаю токен обновления.

И я не могу найти хорошего ответа на вопрос, как я должен получить токен обновления для служебной учетной записи. Есть один или два сообщения stackoverflow, в которых активно упоминается получение токена обновления с учетной записью службы .... но то, на что они ссылались, с тех пор было перенаправлено. Все, что я нашел в отношении токенов обновления, в основном касалось аутентификации вручную и сохранения токена. Поскольку мне нужно использовать учетную запись службы, это невозможно.


person cd921    schedule 10.06.2015    source источник


Ответы (2)


Учетные данные сервисного аккаунта, которые вы получаете из Google Developers Console, включают сгенерированный уникальный адрес электронной почты, идентификатор клиента и как минимум одну пару открытого/закрытого ключа. Вы используете идентификатор клиента и один закрытый ключ для создания подписанного JWT и создания запроса токена доступа в соответствующем формате. Затем ваше приложение отправляет запрос токена на сервер авторизации Google OAuth 2.0, который возвращает токен доступа. Приложение использует токен для доступа к Google API. По истечении срока действия токена приложение повторяет процесс.

Посетите эту страницу для получения дополнительной информации.

person KRR    schedule 10.06.2015
comment
О, я знаю это. Проблема в том, что cr.Retrieve(some-contact-url-here) вызывает OAuthBase.Excute(), который затем вызывает OAuthBase.GetRefreshAccessTokenRequestBody().... который затем терпит неудачу, потому что ваши OAuth2Parameters не будут иметь обновить токен. - person cd921; 11.06.2015

Хорошо, основываясь на нескольких часах яростных ударов головой об API, похоже, что нет никакого способа получить токен обновления, когда вы проходите аутентификацию в качестве учетной записи службы. Ожидаемое поведение, на самом деле.

В любом случае, чтобы решить эту проблему, вы можете загрузить все контакты в память,

feed.AutoPaging = true;
foreach (var c in feed.Entries)
{
    contactList.Add(c);
}

И тогда вы можете обновить|удалить|и т.д. Хотя крайне неэффективно. Особенно, если ваш список контактов становится довольно большим.

person cd921    schedule 10.06.2015