Req.user истекает через 1 час - PullRequest
0 голосов
/ 26 мая 2019

Я реализовал в своем API oauth2 логины с Google, Twitter и Facebook

Я следовал этому уроку: https://l.facebook.com/l.php?u=https%3A%2F%2Flink.medium.com%2F4uqfpmcRYW%3Ffbclid%3DIwAR2vbIRDZ6dcxqc-wmZzCYKD8ddP_lfwlbKbA9C__PlUUcsbxtAwkZaYzBE&h=AT2QbmDmw1Fk_1UJqQKFfHFZr-NoKQ5vlle5ZWJeBsIG1n8B9-Qzh4oU_hqfkSoDwzQj4mQyfZ1tPswvDGQe5eQ4M2Cy85Hq6eNR_z5yMAAVWsXziPADiPol3CC8gH-Xn1OT1w

Все работало нормально, пока я не заметил, что сохраненный файл cookie (connect.sid, который содержит всю информацию о пользователе) больше не распознается по паспорту через 1 час. Файл cookie все еще там, но когда десериализует его паспорт, req.user не определен, и мне абсолютно необходим req.user.id.

Это нормальное поведение? Как правильно десериализовать cookie-файл, если его содержимое «просрочено»?

Я использую следующие стратегии для паспорта: passport-google-oauth20, passport-twitter, passport-facebook

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

const express = require('express');
const app = express();
const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20');
const cookieSession = require('cookie-session');

// cookieSession config
app.use(cookieSession({
    maxAge: 24 * 60 * 60 * 1000, // One day in milliseconds
    keys: ['randomstringhere']
}));

app.use(passport.initialize()); // Used to initialize passport
app.use(passport.session()); // Used to persist login sessions

// Strategy config
passport.use(new GoogleStrategy({
        clientID: 'YOUR_CLIENTID_HERE',
        clientSecret: 'YOUR_CLIENT_SECRET_HERE',
        callbackURL: 'http://localhost:8000/auth/google/callback'
    },
    (accessToken, refreshToken, profile, done) => {
        done(null, profile); // passes the profile data to serializeUser
    }
));

// Used to stuff a piece of information into a cookie
passport.serializeUser((user, done) => {
    done(null, user);
});

// Used to decode the received cookie and persist session
passport.deserializeUser((user, done) => {
    done(null, user);
});

// Middleware to check if the user is authenticated
function isUserAuthenticated(req, res, next) {
    if (req.user) {
        next();
    } else {
        res.send('You must login!');
    }
}

// Routes
app.get('/', (req, res) => {
    res.render('index.ejs');
});

// passport.authenticate middleware is used here to authenticate the request
app.get('/auth/google', passport.authenticate('google', {
    scope: ['profile'] // Used to specify the required data
}));

// The middleware receives the data from Google and runs the function on Strategy config
app.get('/auth/google/callback', passport.authenticate('google'), (req, res) => {
    res.redirect('/secret');
});

// Secret route
app.get('/secret', isUserAuthenticated, (req, res) => {
    res.send('You have reached the secret route');
});

// Logout route
app.get('/logout', (req, res) => {
    req.logout(); 
    res.redirect('/');
});

app.listen(8000, () => {
    console.log('Server Started!');
});```
...