Паспорт, 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');
}