首页 > 解决方案 > 包装 athenticate 函数时 PassportJs 会话不起作用

问题描述

所以我在passportJS本地策略上遇到了这个问题,当我将passport.athenticate包装在一个函数中时,它无法持久登录

谢谢你

这是护照配置

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());

标签: node.jsauthenticationpassport.jsexpress-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)
})

推荐阅读