gpt4 book ai didi

express - Passport 反序列化用户方法从未被调用

转载 作者:行者123 更新时间:2023-12-04 01:12:31 25 4
gpt4 key购买 nike

我有 200 响应登录请求,但 401 用于任何进一步的身份验证检查请求,因为 deserializeUser 从未调用过。我深入研究了 Passport 源并注意到 Passport 检查 req._passport.session.user 是否存在,如果不存在,它不会调用反序列化用户。

我已经搜索了有关 stackoverflow 的其他问题,看来我有具体案例。

有单一的本地策略身份验证类型,我使用 Ajax 请求进行登录请求,配置 CORS 设置,http://localhost:8080 - 前端,http://localhost:3000后端)

我使用 bodyParse、cookieParser、快速 session 、 Passport 初始化和 Passport session 。 Express session secure:false 配置为我通过 http 运行身份验证请求。

你可以在这里找到我的项目(后端 package.json 很好,所以你可以使用它,它没有缺少依赖项,至于前端不确定),至少你可以在那里检查代码。

后台 https://github.com/rantiev/template-api
前端https://github.com/rantiev/template-angular

快速 session 配置和 CORS 在这里 https://github.com/rantiev/template-api/blob/master/modules/appConfigure.js

var path = require('path');
var bodyParser = require('body-parser');
var session = require('express-session');
var cookieParser = require('cookie-parser');
var MongoStore = require('connect-mongo')(session);

module.exports = function (app, express, config, mongoose) {

app.use(cookieParser());
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(bodyParser.json());

app.use(function (req, res, next) {

// Website you wish to allow to connect
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8080');

// Request methods you wish to allow
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

// Request headers you wish to allow
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With, X-AUTHENTICATION, X-IP, Content-Type, Origin, Accept, Cookie');

// Set to true if you need the website to include cookies in the requests sent
// to the API (e.g. in case you use sessions)
res.setHeader('Access-Control-Allow-Credentials', true);

// Pass to next layer of middleware
next();
});

/*app.use(function (req, res, next) {
console.log('coockie is:', req.cookies);
});*/

app.use(session({
saveUninitialized: false,
resave: false,
secret: config.sessionsSecretToken,
cookie: {
secure: false
},
store: new MongoStore({ mongooseConnection: mongoose.connection })
}));

app.use(express.static(path.join(__dirname, '..' , 'public')));

};

Passport 配置在这里 https://github.com/rantiev/template-api/blob/master/api/authentication/authenticationR.js
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var rememberMe = require('../../modules/rememberMe');
var createAccessToken = require('../../modules/createAccessToken');

var bcrypt = require('bcrypt-nodejs');

var UserM = require('../users/userM');

module.exports = function (app, mainRouter, role) {

passport.use(new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
}, function (username, password, done) {

UserM.findOneQ({email: username})
.then(function(user){

if (user && bcrypt.compareSync(password, user.password)) {
done(null, user);
} else {
done(null, false);
}

})
.catch(function(err){
done(err);
});

}));

passport.serializeUser(function (user, done) {

console.log('serialize');

if (user) {
createAccessToken(user, done);
} else {
done(null, false);
}
});

passport.deserializeUser(function (token, done) {

console.log('deserialize');

UserM.findOneQ({accessToken: token})
.then(function(user){

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

})
.catch(function(err){
done(err);
});

});

app.use(passport.initialize());
app.use(passport.session());

mainRouter.post('/me', passport.authenticate('local'), function (req, res) {
res.status(200).send();
});

mainRouter.get('/logout', function (req, res) {
req.logout();
res.redirect('/');
});

mainRouter.get('/me', function (req, res) {

if (!req.user) {
res.status(401).send('Please Login!');
return;
}

var currentUser = {
id: req.user._id,
role: req.user.role
};

res.status(200).json(currentUser);
});

};

最佳答案

如果您查看调用堆栈并发现 deserializeUser没有被调用,因为 req._passport.session.user没有设置,那么你的问题如下。有问题的行在 express-session模块:

if (!req.sessionID) {
debug('no SID sent, generating session');
generate();
next();
return;
}

如果设置了 sessionID, generate永远不会被调用:
store.generate = function(req){
req.sessionID = generateId(req);
req.session = new Session(req); // THIS
req.session.cookie = new Cookie(cookieOptions);

if (cookieOptions.secure === 'auto') {
req.session.cookie.secure = issecure(req, trustProxy);
}
};

但是有可能有 req.sessionID设置,而 req.session为空,这解释了 req._passport.session.user为空— req.session永远不会设置。

我继续追溯到更远的时候 req.sessionID已设置,对于新的 cookie,有时会被设置,有时不会。

为什么?我不知道,希望有人进一步调查,但基本上,教训是尝试使用 cookie-session取而代之的是模块。

关于express - Passport 反序列化用户方法从未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36249119/

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