Как обменять код авторизации с токеном в Auth0, когда сервер авторизации за прокси - PullRequest
0 голосов
/ 12 января 2019

Я работаю над веб-приложением с весенней загрузкой, где приложение размещено за обратным прокси-сервером Zuul, а шлюзом API является nginx. Все приложения работают на одной виртуальной машине (NginX, Zuul и My App) Nginx выполняет завершение SSL, а zull отвечает за аутентификацию и авторизацию запросов. Я использую OpenID Connect для аутентификации пользователя с Auth0.

поток запроса

Browser --(A)--> NginX --(B)--> Zuul --(c)--> My Application

A - https звонок с доменным именем, например: https://example.com

B - http-вызов для локально работающего сервера Zull, например: http://127.0.0.1:7070

На сервере nginx я дал правило перенаправлять весь трафик на локально работающий сервер Zull

https://example.com -> http://127.0.0.1:7070

В этой конфигурации URL обратного вызова устанавливается как https://example.com/callback в Auth0, и после вызова URL обратного вызова он будет отправлен на сервер zuul с другим именем.

https://example.com/callback?code=sf4sf4ds4fdf --> http://127.0.0.1:7070/callback?code=sf4sf4ds4fdf

Я использовал библиотеки, предоставленные Auth0, чтобы обменять код авторизации на токен. но в этот момент запрос на токен содержит URL-адрес обратного вызова как http://127.0.0.1:7070/callback, а не как https://example.com/callback (это то, что я зарегистрировал в Auth0 и использовал для получения кода авторизации). Поэтому система всегда выдает и ошибку.

Я могу заставить это работать, удалив сервер nginx и непосредственно сохранив сервер zuul впереди (тогда нет никаких изменений URL). Есть ли способ заставить это работать с моей существующей конфигурацией.

Спасибо

1 Ответ

0 голосов
/ 13 января 2019

Кажется, на данный момент эта проблема не может быть решена, потому что запрос на обмен токена на авторизованный код встроен в библиотеку, предоставленную Auth0 (mvc-auth-common-1.0.2.jar) . URL обратного вызова генерируется путем вызова req.getRequestURL (). ToString () .

Поскольку запрос был отправлен прокси-сервером nginx на сервер zull, URL-адрес запроса всегда равен https://127.0.0.1:7070

Чтобы быть успешным, мне пришлось использовать небольшой взлом. Я обернул объект запроса, используя специальную оболочку http-запроса.

import javax.servlet.http.HttpServletRequestWrapper;
class CustomRequesWrapper extends HttpServletRequestWrapper {

        public CustomRequesWrapper(HttpServletRequest request) {
            super(request);
        }

        @Override
        public StringBuffer getRequestURL() {
            return new StringBuffer("https://example.com/callback");
        }
    }

Здесь я возвращаю нужный URL.

// Tokens tokens = controller.handle(req); -- previous code 
Toke tokens = controller.handle(new CustomRequesWrapper(req)); // current code

Теперь, когда вызывается метод getRequestURL () , передается мое доменное имя.

...