Маршрутизация на стороне сервера против Интерфейсная маршрутизация с прокси

#javascript #node.js #auth0

#javascript #node.js #auth0

Вопрос:

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

У меня есть приложение React, которое использует Node.js и Express на серверной части. Я объявил "proxy": "http://localhost:3001" в своем package.json , что я не уверен на 100%, что это делает, но я знаю, что это помогает подключить мой сервер (который работает на порту 3001).

Проблема, с которой я столкнулся, возникла при настройке Auth0 в моем бэкэнде для проверки пользователей. Первое, что я заметил, было то, что я не смог выполнить запрос get к http://localhost:3001/login вместо этого мне пришлось перенаправить пользователя по URL http://localhost:3001/login . Я не уверен, почему это так, но я предполагаю, что это как-то связано с настройками Auth0.

После входа в систему Auth0 возвращает пользователям URL обратного вызова. Документы Auth0 рекомендуют использовать, localhost:3000/callback поскольку в этих документах также есть внутренняя конечная точка /callback . Однако после входа в систему пользователь просто перенаправляется на пустую страницу по адресу http://localhost:3000/callback , а конечная точка сервера никогда не попадает. Мне это показалось странным, поскольку я в основном копировал и вставлял из руководства Auth0 по настройке входа в систему с помощью Express.

В любом случае я обнаружил, что если я изменил URL обратного вызова на свой сервер на http://localhost:3001/callback , то выполняется код на стороне сервера. Это имеет смысл, отличный от того, что в документах Auth0 говорится об использовании порта 3000. Похоже, что, возможно, мой прокси-сервер должен как-то связать их.

Функция конечной точки обратного вызова выглядит следующим образом:

 router.get('/callback', function (req, res, next) {
    console.log('called')
    passport.authenticate('auth0', function (err, user, info) {
        if (err) {
            return next(err);
        }
        if (!user) {
            return res.redirect('/login');
        }
        req.logIn(user, function (err) {
            if (err) {
                return next(err);
            }
            const returnTo = req.session.returnTo;
            delete req.session.returnTo;
            res.redirect(returnTo || '/user');
        });
    })(req, res, next);
});
  

Когда это выполняется успешно, оно должно перенаправить пользователя на мою страницу пользователей по адресу localhost:3000/users однако, потому что я изменил маршрут обратного вызова на ‘localhost: 3001 / обратный вызов the callback endpoint is routing me to localhost: 3001 / users`.

Я могу отчасти видеть, что происходит. Когда я перехожу к URL-адресу, используя 3001, я попадаю в свои конечные точки. Когда я перехожу по URL-адресу, используя 3000, я просматриваю свои интерфейсные страницы. Я просто не понимаю, почему в документах Auth0 говорится, что мне следует использовать мой порт внешнего интерфейса для обратного вызова?

Ответ №1:

Я попытаюсь помочь, но я не уверен, что это ответ.

Если вы установите в своем package.json значение прокси на "proxy": "http://localhost:3001" , то в вашем приложении для отправки запроса вам не нужно использовать полный URL,

 axios.get('/login').then(res=>res.data).catch(err=>console.log(err));
  

Например, без установленного прокси

  axios.get('http://localhost:3001/login').then(res=>res.data).catch(err=>console.log(err));
  

В Auth0 URL-адрес хоста и порт не являются проблемой, вы можете использовать все, что захотите, главное — это /callback маршрут, в Auth0 вы можете настроить пользовательский маршрут для обратного вызова, но по умолчанию в вашем приложении у вас должен быть маршрут /callback . не забудьте добавить localhost: 3001 в конфигурации Auth0

Я надеюсь помочь.