我正在使用网络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);
});
});
...
答案 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