Ошибка неавторизованного клиента при использовании делегирования всего домена с 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 показывает правильное сообщение об ошибке.
Обновить
Вот контрольный список, который я создал для устранения ошибок учетных записей служб:
- Убедитесь, что делегирование домена включено для служебной учетной записи в Google Cloud Console.
- Убедитесь, что вы ввели правильные области в консоли администратора Google с идентификатором клиента учетной записи службы (а не ее адресом электронной почты!). Убедитесь, что все области действительны! Они могут стать недействительными при жизни. Когда вы вводите неверную область вы получаете
unauthorized_client
ошибка при получении токена доступа даже для действительной области.