node.js - 包装 athenticate 函数时 PassportJs 会话不起作用
问题描述
所以我在passportJS本地策略上遇到了这个问题,当我将passport.athenticate包装在一个函数中时,它无法持久登录
- 当我尝试登录路由 /loginT 然后转到 /whoami 它工作得很好
- 但是当我使用 /login 时,它会以用户对象响应,但是当我点击 /whoami 时它会记录未定义,我认为我在某处犯了错误,但我找不到它有什么问题
谢谢你
这是护照配置
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy
const UserDB = require('../models/users')
const { UserStatus } = require('../middleWares')
const signIn = new LocalStrategy (
function( username , password , callback) {
UserDB.findOne(
{$or : [{username:username},{email:username}]},
async function(err,user){
if (err) callback({
success:false,
code:403,
message:err,
}, false) ;
if (!user)
callback({
success:false,
code:403,
message:'Username not found',
}, false)
if (!(await user.verifyPassword(password)))
callback ({
success:false,
code:403,
message:'Username or Password is incorrect',
},false)
if(user.status === UserStatus.PENDING_EMAIL_ACTIVATION) {
callback({
success:false,
code:93,
message:'Please Activate your account first',
},false,)
}
callback(null,user)
}
)
}
)
passport.use('local-signin',signIn)
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
UserDB.findById(id, function (err, user) {
done(err, user);
});
});
module.exports = passport;
用户路由文件
router.post('/loginT',passport.authenticate('local-signin',{
failureRedirect:'/Login',
successRedirect:'/'
}))
router.get('/whoami',async (r,res) => {
console.log(r.user)
return res.send({user:r.user})
})
router.post('/login',async (r,s)=>{
passport.authenticate('local-signin',{},function(err,_user,info){
if(err) s.send(err)
if(_user) s.send({
success:true,
code:200,
data:{..._user._doc,
password:null,
_id:null
}})
})(r,s)
})
服务器.js
const passport = require('./passport');
app.use(require('express').json())
app.use(cookieParser());
app.use(require('express-session')({
secret: 'keyboard cat',
resave: false,
saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
解决方案
*** 已解决 *** 我忘了使用 request.logIn(user, function) 所以我不得不将登录路由设置为下一个
router.post('/login',async function (r,s){
passport.authenticate('local-signin',{},function(err,_user,info){
if(err) s.send(err)
r.logIn(_user,function(error) {
if(error) return s.send({
success:false,
code:403,
message:error,
})
return s.send({
success:true,
code:200,
data:{..._user._doc,
password:null,
_id:null
}})
})
})(r,s)
})
推荐阅读
- python - 尽管代码以前可以工作,但出现关键错误
- angular - While 循环未读取数组对象的当前长度(角度 6)
- java - 准备好的语句中的动态 where 条件的 SQL 注入
- python - Flask render_template 上下文未显示在 URL 中
- python - Python - 选择所需选项时有关数组的问题
- javascript - 使用 PIXI.Sprite.fromImage 和 PIXI.loader.resources 有什么区别?
- c# - 如何在 selenium webdriver C# 中隐藏密码
- r - 删除分散在字符串中的多个标点符号
- scrapy-spider - 如何选择html标签中的所有href属性包含一个公共类。在 Scrapy 中
- python - 基于浓度结合GeoPandas Dataframe和Pandas Dataframe