Как отправить токен Oauth от обратного вызова на сервере клиенту?

Я использую ExpressJs и паспорт для аутентификации. Я использую Google Oauth2.0 для входа со стандартным паспортом GoogleStrategy. На клиенте я использую axios для отправки запроса входа на сервер. Мой логин маршруты:

router.get(
    "/google",
    passport.authenticate("google", { scope: ["profile", "email"] }));

router.get(
    "/google/callback",
    passport.authenticate("google", { failureRedirect: "/"}),
    function(req, res) {

        const token = jwt.sign({id: req.user.id}, configAuth.secretKey);
        console.log("generated token: ", token);
        res.json({success: true, token: 'bearer ' + token});

    }
);

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

На клиенте я использую axios, чтобы отправить запрос, получить JWT и сохранить его в localstore.

axios.get('http://localhost:3001/google')
  .then((result) => {
    console.log("result", result);
    localStorage.setItem('jwtToken', result.data.token);
  })
  .catch((error) => {
    // if(error.response.status === 401) {
    //   this.setState({ message: 'Login failed. Username or password not match' });
    // }
    console.log("Login error", error);
  });

Но Axios не ждет, когда произойдет перенаправление, и возвращает HTML-документ с сообщением Loading.... Если вы попытаетесь получить доступ к API в браузере, он вернет нужный объект JSON. Есть ли способ ждать перенаправления. Должен ли я использовать другую библиотеку для отправки запроса на вход?

Я попытался отправить токен в качестве параметра URL с

res.redirect()

но клиент и сервер находятся на разных портах, поэтому он не работает. Есть ли другой способ сделать это?

1 ответ

Если вы не решили проблему, в passportjs вместо googleOAuth используйте обходной путь googleTokenStategy. Таким образом, вы можете использовать реагирующий плагин GoogleLogin, чтобы получить токен доступа от внешнего интерфейса и отправить его через axios.post на внутреннюю ссылку, а затем настроить jwt. Ссылка здесь

Путь Google OAuth2 перенаправляет ваш браузер, что приводит к перезагрузке страницы, пару раз до ее завершения. В результате ваш клиентский код,

axios.get('http://localhost:3001/google')
  .then((result) => {
    console.log("result", result);
    localStorage.setItem('jwtToken', result.data.token);
  })...

никогда не достигнет .then() блок. Вы, вероятно, видите это в браузере; Вы нажимаете кнопку или что-то, чтобы перейти к 'http://localhost:3001/google', и ваш localhost:3001 Сервер перенаправляет ваш браузер на страницу входа в Google. Теперь, когда ваш браузер находится на странице входа, он не запоминает axios.get Заявление выше - этот код веб-страницы пропал.

Вам нужно обработать JWT в коде на стороне клиента, который ваш сервер отправляет в ответ

axios.get('http://localhost:3001/google/callback').

Это последняя остановка вашего браузера на пути OAuth2 - как только вы туда попадете, вас больше не перенаправят. Вы можете поставить свой axios.get Функция выше внутри этого клиентского кода.

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