使用Passport + Express身份验证时,浏览器中不存储cookie

时间:2016-11-20 13:25:08

标签: javascript api express cookies passport.js

我正在使用网络API。流程应如下:

用户登录网站 - > Passport对用户进行身份验证 - > Passport在持久会话中存储有关用户的信息 - >只要会话有效,用户就可以访问API。

不幸的是,我无法通过Passport来创建持久会话。登录部分有效(只有有效用户通过),但Passport不会在客户端的浏览器中存储有关会话的任何信息。因此,用户无法从此处访问API。

与问题相关的代码部分如下所示:

Server.js:

// call the packages we need
var express    = require('express');        // call express
var app        = express();                 // define our app using express
var bodyParser = require('body-parser');    // for accesing data from POST requests
var passport = require('passport');         // for user authentication
var flash    = require('connect-flash');    // for session management
var cookieParser = require('cookie-parser');// for reading cookies

// Setup the database connection
var configDB = require('./config/database.js');
var mongoose   = require('mongoose');
mongoose.connect(configDB.url);

// Pull schema for training
var Training = require('./models/training');

// configure app 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser()); 


// required for passport
require('./config/passport')(passport); // pass passport for configuration

app.use(require('express-session')({
    cookie : {
    maxAge: 3600000, // see below
    secure: false
  },
    secret: 'khugugjh',
    resave: false,
    saveUninitialized: true
})); // session secret
app.use(passport.initialize());
app.use(passport.session());
app.use(flash()); // use connect-flash for flash messages stored in session

...

routes.js:

...

// the login route

    router.route('/login').post(
  passport.authenticate('local-login'),
  function(req, res) {
    // If this function gets called, authentication was successful.
    // `req.user` contains the authenticated user.
    console.log('logged in: ' + req.user);
  });

...

passport.js:

...

// the serilization and deserilization functions for Passport

passport.serializeUser(function(user, done) {
        console.log('Serialize: ' + user); 
        return done(null, user._id);
    });

    // used to deserialize the user
    passport.deserializeUser(function(id, done) {
        console.log('trying to des'); 
        User.findById(id, function(err, user) {
            console.log('Deserialize: ' + user); 
            return done(err, user);
        });
    });


...

1 个答案:

答案 0 :(得分:1)

您可能遇到此问题的一个原因可能与客户端请求的方式有关。如果您使用的是ES6 fetch API,那么您必须确保将密钥credentials传递给值为"include"的options对象。

例如:

    fetch('/restricted', {
      method: 'get',
      credentials: 'include'
    });

这解决了我的问题。此外,需要注意的一点是,如果您使用的是cookie-parser express-session,则不需要v1.5.0中间件。

希望有所帮助。

其他资源:https://developers.google.com/web/updates/2015/03/introduction-to-fetch