javascript - PassportJS och Express 4 sparar inte cookies/session korrekt


Jag har en app som använder Express 4 med Passport 0.3.2. Jag har ställt in en passport-local-strategi, som hämtar korrekt användarinformation när /session-ändpunkten skickas ett användarnamn och lösenord.

Men användarinformationen sparas aldrig korrekt. Därför är req.user alltid odefinierad i alla lyssnare och req.isAuthenticated() returnerar alltid falskt.

Jag har sett andra inlägg som ofta hittar problem med ordningen på mellanmjukvaruinställningarna, men jag har ordnat dem på rätt sätt och därför är jag inte säker på vart jag ska gå härifrån.

Här är min POST-lyssnare för /session:

app.post("/session",
    passport.authenticate('local'),
    (req: any, res: any) => {
        // if we reach this point, we authenticated correctly
        res.sendStatus(201);
    }
);

Här är min LocalStrategy-inställning:

passport.use(new LocalStrategy(
    (username, password, done) => {
        let users = userRepository.getAll();

        let usernameFilter = users.filter(u => u.getUsername() === username);
        if (!usernameFilter || usernameFilter.length !== 1) {
            return done(null, false, { message: 'Incorrect username.' });
        }

        if (!password || password !== "correct") {
            return done(null, false, { message: 'Incorrect password.' });
        }

        return done(null, usernameFilter[0]);
    }
));

Här är min appinställning:

let app = express();
app.use(cookieParser());
app.use(bodyParser.json());
app.use(expressSession({
    secret: 'my secret key',
    resave: true,
    saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());

Jag använder följande beroendeversioner:

"body-parser": "^1.15.1",
"cookie-parser": "^1.4.3",
"express": "^4.13.4",
"express-session": "^1.13.0",
"passport": "^0.3.2",
"passport-local": "^1.0.0"

Jag har lagt till en callback till min POST /session, men ett fel uppstår. Detta är min callback:

app.post("/session",
    passport.authenticate('local', {
      session: false
    }),
    (req: express.Request, res: express.Response) => {
        req.logIn(req.user, (err: any) => {
            if (err)
                throw err;
        });

        // if we reach this point, we authenticated correctly
        res.sendStatus(201);
    }
);

Jag får följande felmeddelande:

Fel: Misslyckades med att serialisera användare till session

Svar #1

Jag hittade den här frågan från en Google-sökning när jag hade ett relaterat problem.

Vad jag insåg var att express-session inte bevarar sessioner t.ex. mellan serveromstarter. Läs här för mer information.

Så jag bytte express-session mot cookie-session istället:

app.use(cookieSession({
    name: 'MyAppName',
    keys: ['very secret key'],
    maxAge: 30 * 24 * 60 * 60 * 1000 // 30 days
}));

Och sedan sparade PassportJS mina sessioner, ingen ytterligare ändring behövdes!

Svar #2

Från passhandlingarna:

Observera att när du använder en anpassad callback blir det applikationens ansvar att etablera en session (genom att anropa req.login()) och skicka ett svar.

Ah, bra, vi gör framsteg. Du kommer att behöva konfigurera passport för att serialisera och deserialisera användarinformationen. Se detta för information. Det bör noteras att du kommer att ersätta User med ditt eget databasåtkomstobjekt.

Relaterade artiklar