2017-02-08 1 views
0

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

На стороне сервера я использую LoopBack, который использует библиотеку Node/Express Passport для OAuth2. На стороне Android я использую современную библиотеку регистрации Google.

Библиотека входа в систему Android принимает все меры предосторожности, предлагая пользователю выбрать учетную запись Google для входа в систему. Как только это произойдет, библиотека предоставит мне токен сервера.

Этот сервер аутентификации маркер может затем быть передан/аутентификации/Google/обратный вызов? Лексема = ... на заднем конце, который затем регистрирует меня.

До сих пор все это работает на степени. Пока что мой back-end работает на моей машине разработки. В консоли API Google URI обратного вызова для ключа OAuth2 указывает на http://localhost:3000/auth/google/callback. В частности, в моем приложении для Android я успешно получаю токен аутентификации. Если я вручную вставлю это в Postman, запущенном на моей машине разработки, чтобы ПОЛУЧИТЬ до http://localhost:3000/auth/google/callback, он успешно аутентифицируется. Однако, если я попытаюсь выполнить окончательный фрагмент головоломки, так что само приложение передает токен серверному приложению, возникает ошибка несоответствия URI с перенаправлением. Это, я могу только предположить, состоит в том, что HTTP-запрос от Postman на том же компьютере содержит «localhost» в заголовке хоста. Но запрос от чего-либо еще имеет IP-адрес компьютера в заголовке хоста.

Во-первых, хотя я, как правило, понимаю поток OAuth2, и я понимаю, что цель обратного вызова заключается в том, что сам сервер Google возвращает токен аутентификации на ваш сервер в контексте веб-приложения, чего я не полностью понимать релевантность URI обратного вызова в случае, когда приложение получает токен аутентификации, а затем выполняет задачу передачи маркера самому URI обратного вызова обратного вызова.

Во-вторых, как я могу успешно передать токен аутентификации на мой сервер разработки и успешно пройти аутентификацию? Консоль Google API позволит мне указать localhost, но, очевидно, не IP-адрес локальной сети.

+0

Проверьте здесь и посмотрите, отвечает ли это на ваш вопрос: http://stackoverflow.com/questions/28731646/google-oauth-2-0-redirect-uri-mismatch-error-for-cross-client-single-sign -on –

+0

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

+0

@ChantellOsejo Большое спасибо за ваши комментарии. Я опубликовал ответ сам ниже, после некоторых выводов, которые я сделал сегодня вечером, но дальнейшие мысли и помощь будут с благодарностью оценены. – Trevor

ответ

0

Что я обнаружил, так это то, что это связано с свойством callbackURL, которое существует в файле LoopBack providers.json как часть конфигурации Passport.

Первоначально, у меня было установлено /auth/google/callback. Теперь от того, что я могу только предположить, что этот процесс происходит:

  • Если я использую Почтальон на машине разработчика представить маркер аутентификации приложению LoopBack, то паспорт присоединяет localhost:3000 к /auth/google/callback. Таким образом, когда Passport делает свой запрос на сервер Google, полный URI обратного вызова, который он сформировал, совпадает с моим URI с использованием белого списка в консоли API (http://localhost:3000/auth/google/callback), и запрос успешно завершен.

  • Мое другое устройство в локальной сети (устройство Android) делает запрос HTTP на моей машине разработки, на которой запущено приложение LoopBack. Тогда я могу только предположить, что Passport создает абсолютный URI обратного вызова из того, что находится в заголовке HTTP host (IP-адрес моей машины 192.168.x.x) и добавляет /auth/google/callback. Поэтому запрос от Passport to Google не выполняется, потому что http://192.168.x.x:3000/auth/google/callback не соответствует http://localhost:3000/auth/google/callback. Я предполагаю, что если Passport настроен с относительным callbackURL, то, по-видимому, он объединяется с req.headers.host или что-то в этом роде.Я предполагаю, что это нормально, если вы хотите иметь приложение, которое работает как в разработке, так и в производстве, не требуя каких-либо изменений конфигурации, но оно бросает гаечный ключ в работу, когда я хочу использовать свое приложение для Android на сервере devopment.

Таким образом, одно решение, которое работает, с точки зрения позволяет Android устройства представить маркер аутентификации для серверного приложения на моей машине развития, который приложение-сервер успешно искупает с Google, для меня не имеет никакого обратного вызова URI, определенный в консоли API, и чтобы параметр callbackURL был исключен из конфигурации Passport. Проблема с этим заключается в том, что обычный веб-вход не работает (поскольку веб-страница Google содержит 400 ошибок, заявляя, что URI обратного вызова отсутствует).

Альтернативой является то, что я установил callbackURL в абсолютный http://localhost:3000/auth/google/callback (а не относительный) и поместил его в качестве URI обратного вызова на консоли API. С помощью этого метода я могу войти в систему, используя веб-интерфейс серверного приложения, и аутентифицироваться из моего приложения Android.

Я думаю, что мне нужно будет использовать конфигурацию окружения абсолютного callbackURL.

Смежные вопросы