簡體   English   中英

在Passport Express中會話不持久

[英]Sessions not persistent in Passport Express

我看過其他標題完全相同的帖子,但是這些帖子都沒有解決我的問題。 用戶登錄時,它會短暫抓取用戶對象,然后將其放在下一個渲染中。 我目前正在后端進行所有操作,因此問題就在這里。 我確保我也有正確的進口訂單。 這是相關的代碼。

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const cors = require('cors');
const mongoose = require('mongoose');
const passport = require("passport");
var passportGithub = require('./auth/github')
const KBRoutes = express.Router();
const PORT = 4000;
let KB = require('./models/kb')
let Tags = require('./models/tags')
let User = require('./models/user')
const session = require('express-session')
mongoose.connect(process.env.MONGODB_URI || 'mongodb://127.0.0.1:27017/kb', { useNewUrlParser: true });
const connection = mongoose.connection;
app.use(cors());
app.use(bodyParser.json());


app.use(
    session({
        secret: process.env.APP_SECRET || 'this is the default passphrase',

    })
)
app.use(passport.initialize())
app.use(passport.session()) 

KBRoutes.get('/auth/github', passport.authenticate("github"));
KBRoutes.get(
    "/auth/github/callback",
    passport.authenticate("github", {
        failureRedirect: "/auth/login/failed"
    }),
    function (req, res) {
        var token = req.user.id;
        res.redirect("http://localhost:3111?token=" + token);
    },
);
app.use(function (req, res, next) {
    console.log('===== passport user =======')
    console.log(req.session)
    console.log(req.user)
    console.log('===== END =======')
    next()
})

init.js

var passport = require('passport');
var User = require('../models/user');


module.exports = function () {
    passport.serializeUser(function (user, done) {
        done(null, user.id);
    });

    passport.deserializeUser(function (id, done) {
        User.findById(id, function (err, user) {
            done(err, user);
        });
    });

};

戰略

var passport = require('passport');
var GitHubStrategy = require('passport-github2').Strategy;

var User = require('../models/user');
var config = require('../_config');
var init = require('./init');

passport.use(new GitHubStrategy({
    clientID: config.github.clientID,
    clientSecret: config.github.clientSecret,
    callbackURL: config.github.callbackURL
},
    function (accessToken, refreshToken, profile, done) {
        var searchQuery = {
            name: profile.username
        };

        var updates = {
            name: profile.username,
            someID: profile.id
        };

        var options = {
            upsert: true
        };

        // update the user if s/he exists or add a new user
        User.findOneAndUpdate(searchQuery, updates, options, function (err, user) {
            if (err) {
                return done(err);
            } else {
                console.log(user)
                return done(null, user);
            }
        });
    }

));

// serialize user into the session
init();


module.exports = passport;

編輯:會話丟失數據,並且序列化后req.user變為未定義。 在此之前的所有工作均有效。

我認為這是因為有多個passport實例可能使該應用程序陷入困境。 我會刪除init.js文件並將其集成到Strategy文件中,如下所示:

var passport = require('passport');
var GitHubStrategy = require('passport-github2').Strategy;

var User = require('../models/user');
var config = require('../_config');

passport.serializeUser(function (user, done) {
    done(null, user.id);
});

passport.deserializeUser(function (id, done) {
    User.findById(id, function (err, user) {
        done(err, user);
    });
});
passport.use(new GitHubStrategy({
    clientID: config.github.clientID,
    clientSecret: config.github.clientSecret,
    callbackURL: config.github.callbackURL
},
    function (accessToken, refreshToken, profile, done) {
        var searchQuery = {
            name: profile.username
        };

        var updates = {
            name: profile.username,
            someID: profile.id
        };

        var options = {
            upsert: true
        };

        // update the user if s/he exists or add a new user
        User.findOneAndUpdate(searchQuery, updates, options, function (err, user) {
            if (err) {
                return done(err);
            } else {
                console.log(user)
                return done(null, user);
            }
        });
    }

));

module.exports = passport;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM