javascript - passport.js 没有将用户传递给 session

标签 javascript node.js passport.js

我正在尝试使用 passport.js、node 和 sequelize 创建一个应用程序。 但是,passport 没有按预期返回 session 中的用户。

当我登录 req.session 时,我得到了这个:

Session {
  cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true,
     secure: true } }

当我记录 req.session.passport 时,我得到了 undefined。

我该如何解决这个问题?

这是我的 server.js:

const express = require('express');
const load = require('express-load');
const passport = require('passport');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const session = require('express-session');

// var app = express();
var app = module.exports = express();

// read cookies (needed for auth)
app.use(cookieParser()); 

// get information from html forms
app.use(bodyParser()); 

//set session
app.set('trust proxy', 1) // trust first proxy
app.use(session({
  secret: 'asdasdsada',
  resave: false,
  saveUninitialized: true,
  cookie: { secure: true }
}))

// required for passport
app.use(passport.initialize());
app.use(passport.session({
    secret: 'adsdssa',
    name: 'sadasd',
    proxy: true,
    resave: true,
    saveUninitialized: true
}));

这是我的 passport.js:

var LocalStrategy = require('passport-local').Strategy;
var SlackStrategy = require('passport-slack').Strategy;

var User  = require('../models/index').User;

var mysql = require('mysql');
var connection = mysql.createConnection({
  host     : process.env.MYSQL_HOST,
  user     : process.env.MYSQL_USER,
  password : process.env.MYSQL_PASSWORD,
  database : process.env.MYSQL_DB
});

module.exports = function(passport) {

    passport.serializeUser(function(user, done) {
        console.log('-----------serialize');
        done(null, user.id);
    });

    passport.deserializeUser(function(id, done) {
        console.log('----------deserialize');
        Model.User.findOne({
          where: {
            'id': id
          }
        }).then(function (user) {
          if (user == null) {
            done(new Error('Wrong user id.'));
          }

          done(null, user);
        })
    });

    passport.use('slack', new SlackStrategy({
        clientID: process.env.SLACK_ID,
        clientSecret: process.env.SLACK_SECRET,
        callbackURL: process.env.SLACK_REDIRECT,
        scope: "incoming-webhook users:read"
    },
        function(accessToken, refreshToken, profile, done) {

            var values = { 
                where: { slack_id: profile.id }, 
                defaults: {slack_id: profile.id, name: profile.displayName} 
            };

            User.findOrCreate(values)
            .spread(function(user, created) {
                return done(null,user);
            });

        }
    ));

这些是我正在使用的路线:

app.get('/auth/slack',
        passport.authorize('slack'));

app.get('/auth/slack/callback', 
        passport.authorize('slack', { failureRedirect: '/login' }),
        function(req, res) {
            //Successful authentication, redirect home.
            console.log(req.session);
            console.log(req.session.passport);
            res.redirect('/dashboard');
        }
    );

最佳答案

我遇到了同样的问题并解决了。

只需删除

secure: true 

像这样的 session

//set session
app.use(session({
  secret: 'asdasdsada',
  resave: false,
  saveUninitialized: true
}))

它应该有效你也可以在这里看到 passport-local 的简单例子 https://github.com/passport/express-4.x-local-example

关于javascript - passport.js 没有将用户传递给 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40954752/

相关文章:

javascript - JavaScript 引用错误 onclick

node.js - eb create 错误:LargeZipFile::文件计数需要 ZIP64 扩展名

javascript - 如何调试 Heroku?

javascript - 关于node.js中passport.js模块 "deserializeUser"的效率

javascript - 如何在 azure 上部署和运行 Passport Express Node

javascript - NativeScript - 如何减少 iOS 的应用程序图标角标(Badge)编号

javascript - 如何删除html标签和head标签之间的iframe标签?

javascript - 这个 JavaScript if 语句有什么问题?

javascript - 保存 Mongoose 嵌套架构

passport.js - NestJS Fastify 身份验证