Кросс-клиентский Google OAuth: получите код авторизации на iOS и маркер доступа на сервере

Я пытаюсь настроить Google OAuth с помощью своего приложения для iOS и веб-приложения Rails. У меня есть 2 отдельных клиента (с разными идентификаторами клиентов, но с одинаковым префиксом), настроенных в консоли API. Один для приложения iOS, а другой для веб-приложения (которое также имеет client_secret, Я хочу использовать AppAuth SDK на iOS, чтобы получить код авторизации пользователя, а затем отправить его в мое веб-приложение, которое затем выполнит обмен токеном доступа.

Прежде всего, это звучит разумно, или же невозможно разделить транзакцию по таким клиентам?

Моя первая попытка состояла в том, чтобы просто взять код авторизации и выполнить обмен, но это не удалось с missing_code_verifierinvalid_grant ошибка, поэтому я тоже прошел то же самое code_verifier этот AppAuth использовал для получения кода авторизации на моем сервере, и это исправило эту ошибку. Прежде всего, нужно ли передавать этот верификатор кода на сервер? Кажется немного странным

Теперь, однако, это не с unauthorized_client ошибка. Мое веб-приложение делает запрос следующим образом:

{
  "grant_type"=>"authorization_code",
  "code"=>"4/XYZ...",
  "client_id"=>"WEB_APP_CLIENT_ID_HERE.apps.googleusercontent.com", 
  "client_secret"=>"WEB_APP_CLIENT_SECRET_HERE", 
  "redirect_uri"=>"https://www.myapp.com/oauth_callback", 
  "parse"=>"json",
  "code_verifier"=>"CODE_VERIFIER_STRING_HERE"
}

Глядя на сообщения, как:

это выглядит как redirect_uri может быть проблема здесь. Мой конфиг AppAuth на iOS имеет URI перенаправления, установленный как com.googleusercontent.apps.iOS_CLIENT_ID_HEREи Info.plist Схема URL тоже. В разделе "Авторизованные URI перенаправления" веб-приложения в консоли API есть несколько веб-URL, и я добавил com.google... к этому также. Этот конфиг неверен? Это redirect_uri важно при выполнении меж-клиентской аутентификации?

Любая помощь очень ценится! Все мои методы проб и ошибок до сих пор не принесли результатов:(

1 ответ

Решение

Я ведущий специалист по AppAuth и работаю над Google Identity Platform; надеюсь, я могу помочь.

Я хочу использовать AppAuth SDK на iOS, чтобы получить код авторизации пользователя, а затем отправить его в мое веб-приложение, которое затем выполнит обмен токеном доступа.

Прежде всего, это звучит разумно, или же невозможно разделить транзакцию по таким клиентам?

Обмен кода на вашем сервере звучит разумно, однако я думаю, что конфигурация, которую вы используете, возможно, неверна. Если вы запрашиваете код для обмена на вашем сервере, используйте идентификатор клиента сервера в запросе к серверу авторизации. Из вашего описания звучит так, как будто ваш запрос сервера авторизации отправляет ваш идентификатор клиента iOS, а затем вы выполняете обмен с идентификатором клиента вашего сервера, и я считаю, что именно поэтому вы видите ошибку "unauthorized_client".

Это не очень хорошо задокументировано, извиняюсь за это. Он упоминается в этом разделе документации по "автономному доступу", хотя в нем говорится только об использовании Android через GoogleApiClient.

Нужно ли передавать этот верификатор кода на сервер? Кажется немного странным

Цель PKCE состоит в том, чтобы гарантировать, что объект, делающий запрос авторизации, такой же, как объект, делающий запрос обмена кодом. code_verifier Не следует оставлять устройство в нормальных условиях.

Однако нет необходимости использовать PKCE, если вы обмениваетесь своим кодом, используя секрет клиента, контролируемый вашим бэкэндом; Вы можете отключить PKCE в AppAuth для этого сценария.

Другие вопросы по тегам