Паспорт, JWT и стратегия Google - отключить сеанс & res.send() после обратного вызова Google

Использование: https://github.com/mstade/passport-google-oauth2.

Я хочу использовать JWT для входа в Google - для этого мне нужно отключить сеанс и каким-то образом передать пользовательскую модель клиенту. Все примеры используют обратный вызов Google, который магическим образом перенаправляет на "/".

Как я:
1. Отключите сеанс при использовании passport-google-oauth2.
2. res.send () пользователь клиенту после аутентификации Google.

Не стесняйтесь предлагать альтернативы, если я не в правильном направлении.

2 ответа

Решение

Успей преодолеть это с помощью некоторых идей:
1. отключить сеанс в экспресс - просто удалите промежуточное программное обеспечение сеанса

// app.use(session({secret: config.secret}))

2. при использовании аутентификации Google на самом деле происходит перенаправление на страницу входа в Google, и, если вход успешный, он перенаправляет вас обратно с URL-адресом, который вы указали.

Это на самом деле означает, что после того, как Google перезвонит вам, вы не сможете выполнить res.send (токен, пользователь) - он просто не работает (кто-нибудь может объяснить, почему?). Таким образом, вы вынуждены сделать перенаправление к клиенту, выполнив res.redirect("/"), Но вся цель состоит в том, чтобы передать токен, чтобы вы могли также сделать res.redirect("/?token=" + token),

app.get( '/auth/google/callback',
        passport.authenticate('google', {
            //successRedirect: '/',
            failureRedirect: '/'
            , session: false
        }),
        function(req, res) {
            var token = AuthService.encode(req.user);
            res.redirect("/home?token=" + token);
        });

Но как клиент получит пользовательский объект? Таким образом, вы также можете передать пользователя таким же образом, но мне это показалось неправильным (передача всей пользовательской сущности в списке параметров...). Поэтому я заставил клиента использовать токен и получить пользователя.

    function handleNewToken(token) {
        if (!token)
            return;

        localStorageService.set('token', token);

        // Fetch activeUser
        $http.get("/api/authenticate/" + token)
            .then(function (result) {
                setActiveUser(result.data);
        });
    }

Это означает еще один http-запрос. Это заставляет меня думать, что, возможно, я не понял концепцию токена. Не стесняйтесь просветить меня.

Инициализировать паспорт в index.js:

      app.use(passport.initialize());

В вашем файлеpassword.js:

      passport.use(
new GoogleStrategy(
{
 clientID: process.env.GOOGLE_CLIENT_ID,
 clientSecret: process.env.GOOGLE_CLIENT_SECRET,
 callbackURL: 
'http://localhost:3000/auth/google/redirect',
},
async (accessToken, refreshToken, profile, 
callback) => {
  // Extract email from profile
  const email = profile.emails![0].value;

  if (!email) {
    throw new BadRequestError('Login failed');
  }

  // Check if user already exist in database
  const existingUser = await User.findOne({ email 
});

  if (existingUser) {
    // Generate JWT
    const jwt = jwt.sign(
      { id: existingUser.id },
      process.env.JWT_KEY,
      { expiresIn: '10m' }
    );

    // Update existing user
    existingUser.token = jwt
    await existingUser.save();

    return callback(null, existingUser);
  } else {

    // Build a new User
    const user = User.build({
      email,
      googleId: profile.id,
      token?: undefined
    });

    // Generate JWT for new user
      const jwt = jwt.sign(
      { id: user.id },
      process.env.JWT_KEY,
      { expiresIn: '10m' }
    );
   
    // Update new user
    user.token = jwt;

    await auth.save();

    return callback(null, auth);
  }
}));

Получите этот JWT в пути через req.user

      app.get('/google/redirect', passport.authenticate('google', 
{failureRedirect: '/api/relogin', session: false}), (req, res) => {
// Fetch JWT from req.user
const jwt = req.user.token;
req.session = {jwt}
// Successful authentication, redirect home
res.status(200).redirect('/home');
}
Другие вопросы по тегам