gpt4 book ai didi

javascript - Express + Passport - req.session.passport 在后续请求中未定义

转载 作者:行者123 更新时间:2023-12-03 05:16:34 27 4
gpt4 key购买 nike

我已经开始开发一个小项目,在客户端使用 React 和 Redux,后端是用 Node、Express 和 Passport.js 完成的我将尽力描述我几个小时以来所苦苦挣扎的事情。身份验证后,当用户从服务器发送到客户端时,会设置字段 req.session.passport 以及 req.user。但是当我执行下一个请求时,无论是注销还是例如/something/add 这些字段都是未定义的。

当进行身份验证时,serializeUser 被调用,但 deserializeUser 没有被调用,我认为不应该在这里,也许我错了。据我调试问题,req.login 也被调用。在接下来的请求中, Passport 似乎没有做任何事情,我没有来自SO和谷歌的想法和答案。我没有尝试自定义回调。

在向客户端发送 anwser 之前的 req.session 如下所示:

Session {
cookie:
{ path: '/',
_expires: 2017-01-11T02:31:49.235Z,
originalMaxAge: 14400000,
httpOnly: false,
secure: false } }

服务器端的代码是:

    passport.serializeUser(function(user, done) {
done(null, user._id);
});

passport.deserializeUser(function(id, done) {
global.Models.User.findById(id, function(err, user) {
done(err, user);
});
});

passport.use(new LocalStrategy(
{
usernameField: 'login',
passwordField: 'password',
passReqToCallback: true
},
function(req, login, password, done) {
global.Models.User.logIn({login: login, password: password}, function(err, user){

if(err){
done(err);
}
else{
done(null, user);
}

});
}
));
var app = express();
var router = express.Router();
router.use(cookieParser());
router.use(bodyParser.urlencoded({extended: false}));
router.use(bodyParser.json());
router.use(session({
cookie : {
secure : false,
maxAge : (4 * 60 * 60 * 1000),
httpOnly: false
},
secret: this._config.session.secret,
resave: false,
saveUninitialized: true
}));
router.use(passport.initialize());
router.use(passport.session());

require('./Router')();
app.use(router);

这里的session对象是express-session。下面的代码就是上面需要的Router.js

var User = require('../Models/User');
var News = require('../Models/News');

var passport = global.Application.getInstanceOf("passport");

function setRoutes(){
router.use(function (req, res, next) {

var log = global.Application.getInstanceOf("logger");

var clientIP = req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress;

log.log("info", req.method + " request from ip: " + clientIP);

res.header('Access-Control-Allow-Origin', 'http://localhost:8080');
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');

if('OPTIONS' == req.method){
res.sendStatus(200);
}
else{
next();
}

});

router.get('/ping', function(req, res){
res.send('ping');
});

router.get('/login/:login', (req, res) => {
Database.client.query(Database.queries.USER_LOGIN, {login: req.params.login}, {useArray: true},
(err, rows) => {
if(err){
res.send({error: "ERROR_DATABASE"});
}
else{
res.send(rows[0][0]);
}
});
});

router.post('/login', passport.authenticate('local', {session: true}),
function(req, res){
console.log(req.session);
req.session.save();
res.send(req.user);
}
);

router.post('/register', (req, res) => {
User.create(req.body, (err, result) => {
if(err){
res.send({error: "ERROR_DATABASE"});
}
res.send(result);
});
});

router.get('/logout', function(req, res){
console.log(req.session);
req.logout();
res.sendStatus(200);
});

router.post('/cms/article', isAuthenticated, (req, res) => {
res.send("BLA");
});

function isAuthenticated(req, res, next){
console.log(req.user);
console.log(req.session);
console.log(req.session.passport);
if(req.isAuthenticated()){
next();
}
else{
res.send("OK");
}
}
}

module.exports = setRoutes;

最佳答案

我已经解决了这个问题。

说明:Cookie 正在通过 express 发送给客户端,但未保存。为此,需要从使用 $.post 更改为 $.ajax,并将 xhrFields 选项设置为 {withCredentials: true}。

除此之外,问题还可能是,cookieParser 现在可能也需要知道 cookie secret 。

关于javascript - Express + Passport - req.session.passport 在后续请求中未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41580081/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com