API доменов Google+ через учетную запись службы завершается с ошибкой 403 Forbidden

У меня есть простой код Ruby, который я объединил из нескольких примеров. Он использует API домена Google+. Я выполнил все шаги для авторизации сервисного аккаунта (https://developers.google.com/+/domains/authentication/delegation), но мои запросы завершаются с ошибкой 403 Forbidden:

{"error"=>{"errors"=>[
{"domain"=>"global", "reason"=>"forbidden", "message"=>"Forbidden"}], 
"code"=>403, "message"=>"Forbidden"}}

Те же запросы работают нормально, если я выполняю их с помощью консоли Google APIs Explorer. Я думаю, что это связано с учетной записью службы и аутентификацией учетной записи пользователя. Что я пропустил?

Полный код находится здесь https://github.com/admitriyev/propellant/blob/master/main.rb

[отредактировано] Я добавил поток установленного приложения в тот же код, и он работал нормально (полный код находится на Gihub выше). Я до сих пор не знаю, что я пропустил в потоке обслуживания.


person Aleksey Dmitriyev    schedule 20.05.2014    source источник
comment
Какой механизм аутентификации и авторизации вы выбрали для API Google? например если вы выбрали для этого схему Google OAuth, вам следует сначала получить токен аутентификации.   -  person cvibha    schedule 20.05.2014
comment
@cvibha Я не совсем понимаю твой вопрос. Это OAuth2 с сервисным аккаунтом и делегированием домена. Это не работает. Однако я только что изменил его, чтобы использовать установленный поток приложений, и он работал нормально.   -  person Aleksey Dmitriyev    schedule 20.05.2014
comment
Вот ссылка на сторонний сервис с помощью Google API   -  person cvibha    schedule 20.05.2014


Ответы (1)


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

client_asserter = Google::APIClient::JWTAsserter.new(
  config['client_email'],
  PLUS_LOGIN_SCOPE,
  key
)
$client.authorization = client_asserter.authorize(config['user_email'])

Мой полный пример здесь: https://github.com/admitriyev/propellant/blob/master/main.rb

person Aleksey Dmitriyev    schedule 22.05.2014