Ошибка неавторизованного клиента при использовании делегирования всего домена с Google API

Мы используем Ruby-клиент Google API с делегированием по всему домену, чтобы обновлять контакты пользователей, анализировать электронные письма, связывать их с нашей БД и т. Д. До 1 апреля все работало просто отлично, однако с тех пор мы получаем unauthorized_client ответ об ошибке.

Signet::AuthorizationError (Authorization failed.  Server message:)
{
  "error": "unauthorized_client",
  "error_description": "Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested."
}

Что я уже пробовал?

Я пытался обновить google-api-ruby-client а также googleauth драгоценные камни до последней версии. Ничего не изменилось.

Я также попытался (дважды) создать новую учетную запись службы, включив ее для DWD и добавив необходимую область в консоли администратора G Suite с идентификатором клиента учетной записи службы. Я ждал 24 часа после добавления областей в консоли администратора и ничего не изменилось.

Обратите внимание, что в прошлом все работало нормально с теми же настройками.

Минимальный код для теста

Вот минимальный код, который выдает ошибку.

require 'googleauth'
require 'google/apis/gmail_v1'

creds = ENV['GOOGLE_SERVICE_ACCOUNT'] # JSON downloaded from cloud console
                                      # is saved in this ENV variable
creds_json = JSON.parse(creds)
creds_json_io = StringIO.new(creds_json.to_json)
auth = Google::Auth::ServiceAccountCredentials.make_creds(
  json_key_io: creds_json_io,
  scope: [Google::Apis::GmailV1::AUTH_GMAIL_MODIFY]
)
auth.sub = 'admin@slideslive.com' # without this line everything works fine
                                  # and I get the access token
auth.fetch_access_token

Насколько я могу сказать, мы делаем все в соответствии с доступной документацией. У кого-нибудь есть предложения, пожалуйста?

Обновить

Я также попытался создать новый проект Google Cloud Platform в той же организации, добавив только учетную запись службы, но все осталось прежним.

1 ответ

Решение

Итак, я наконец выяснил, где проблема. Среди других областей я также включил эти:

http://www.google.com/m8/feeds/contacts/ 
http://www.google.com/m8/feeds/groups/ 

Оказывается, Google, вероятно, лишил их законной силы, и теперь они требуют https вместо http,

Было бы хорошо, если бы они предоставили более качественное сообщение об ошибке, что-то подобное введенным областям будет недопустимым при авторизации их в консоли администратора Google.

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

Обновить

Вот контрольный список, который я создал для устранения ошибок учетных записей служб:

  1. Убедитесь, что делегирование домена включено для служебной учетной записи в Google Cloud Console.
  2. Убедитесь, что вы ввели правильные области в консоли администратора Google с идентификатором клиента учетной записи службы (а не ее адресом электронной почты!). Убедитесь, что все области действительны! Они могут стать недействительными при жизни. Когда вы вводите неверную область вы получаете unauthorized_client ошибка при получении токена доступа даже для действительной области.