Авторизация Google Cross Client и ошибки invalid_grant

В настоящее время я разрабатываю веб-компонент для авторизации кросс-клиента Google Api, как описано в этой статье. https://developers.google.com/identity/protocols/CrossClientAuth

Кроме того, среда, в которой я работаю, - это Rails, поэтому я использую gogle-api-client gem, как описано в этой статье https://developers.google.com/identity/protocols/OAuth2WebServer#handlingtheresponse

Код авторизации получается через приложение Android с использованием идентификатора веб-клиента и передается на веб-сайт api для его обмена. Мое использование драгоценного камня и кода для обмена выглядит следующим образом

auth_client = Google::APIClient::ClientSecrets.load("/path/to/client_secrets.json").to_
authorization
auth_client.code = code
auth_client.fetch_access_token!

Я также пробовал делать

auth_client = Google::APIClient::ClientSecrets.load("/path/to/client_secrets.json").to_
authorization
auth_client.update!(
  :grant_type => 'authorization_code'
)
auth_client.code = code
auth_client.fetch_access_token!

Во всех случаях я получаю недопустимую ошибку гранта от Google без описания.

Я попытался создать URL-адреса, чтобы использовать другие инструменты api, такие как завиток и почтальон, и обойти драгоценный камень, используя игровые площадки google oauth без каких-либо успехов.

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

Ответ 1

{"error": "invalid_grant", "error_description": "Bad Request"}

Обычно означает, что идентификатор и секрет клиента, который вы используете для запроса доступа, не тот, который использовался для создания рассматриваемого кода.

Запрос кода авторизации через учетные данные из приложения Android должен быть авторизован с использованием тех же учетных данных. Таким образом, вы не можете смешивать и сопоставлять учетные данные.

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

Ответ 2

Ну, может быть, это не то решение, которое вы ищете, но я использовал JavaScript login API в интерфейсе приложение и передачу маркера на бэкэнд через параметры, которые жестко закодированы в запросы жемчужины, как этот пример:

ga_view_ids = @service.list_account_summaries(options: {header: {authorization: "Bearer #{params[:access_token]}"}}).items

Надеюсь, это поможет вам в правильном направлении:)