Кросс-клиентский Google OAuth: получите код авторизации на iOS и маркер доступа на сервере
Я пытаюсь настроить Google OAuth с помощью своего приложения для iOS и веб-приложения Rails. У меня есть 2 отдельных клиента (с разными идентификаторами клиентов, но с одинаковым префиксом), настроенных в консоли API. Один для приложения iOS, а другой для веб-приложения (которое также имеет client_secret
, Я хочу использовать AppAuth SDK на iOS, чтобы получить код авторизации пользователя, а затем отправить его в мое веб-приложение, которое затем выполнит обмен токеном доступа.
Прежде всего, это звучит разумно, или же невозможно разделить транзакцию по таким клиентам?
Моя первая попытка состояла в том, чтобы просто взять код авторизации и выполнить обмен, но это не удалось с missing_code_verifier
invalid_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"
}
Глядя на сообщения, как:
- Невозможно обменять код авторизации на токен доступа и обновить токен в Cross Client google oauth2.0
- Google+ Вход для серверных приложений, обмен кода авторизации для токена доступа
это выглядит как 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 для этого сценария.