简体   繁体   中英

passport.js not passing user to session

I'm trying to create an app with passport.js, node and sequelize. But, passport is not returning the user in the session as expected.

When I log req.session I get this:

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

when I log req.session.passport I get undefined.

How can I fix this?

This is my 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
}));

And this is my 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);
            });

        }
    ));

And these are the routes I'm using:

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');
        }
    );

I had the same problem and solved it.

Just remove

secure: true 

for session like that

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

It should works Also you can see simple example of passport-local here https://github.com/passport/express-4.x-local-example

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM