首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Passport Express中的会话不持久

Passport Express中的会话不持久
EN

Stack Overflow用户
提问于 2019-09-13 10:34:03
回答 1查看 45关注 0票数 0

我看过其他标题完全相同的帖子,但是这些帖子都没有解决我的问题。当用户登录时,它会短暂地抓取用户对象,然后在下一次渲染时将其丢弃。我现在都是在后台做这件事,所以问题就在那里。我也确保了导入的顺序是正确的。以下是相关代码。

代码语言:javascript
复制
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);
        });
    });

};

策略

代码语言:javascript
复制
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变得未定义。在此之前,一切都会正常工作。

EN

回答 1

Stack Overflow用户

发布于 2019-09-13 11:15:07

我认为这是因为有多个passport实例可能让这个应用程序变得混乱。我会删除init.js文件并将其集成到Strategy文件中,如下所示:

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57916634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档