Passport 本地身份验证:从未调用过 deseralizeUser

Passport local authentication: deseralizeUser never called

我正在测试应用程序中测试护照本地身份验证,但我不明白为什么在使用 Postman 发送 post 请求时不调用 deserializeUser 但在 post 请求时从未调用来自我的前端(Vuejs)。 我想我管理会话的方式有问题,但我不知道是什么......任何人都可以帮助我理解吗?

Vue 前端:

export default {    
        name: "Login",    
        methods: {    
            login: (e) => {    
                e.preventDefault();  
                let username = "user1";
                let password = "password";    
                let login = () => {    
                    let data = {    
                        username: username,    
                        password: password
                    };    
                    axios.post("http://localhost:5000/api/users", data)    
                    .then((response) => {    
                        console.log("Logged in");    
                        router.push("/");    
                    })    
                    .catch((errors) => {    
                        console.log("Cannot log in");
                    });    
                };    
                login();
            }    
        }    
    }

节点后端:

app.use(cookieSession({  
    name: 'mysession',
    keys: ['vueauthrandomkey'],
    maxAge: 24 * 60 * 60 * 1000
}));
app.use(passport.initialize());
app.use(passport.session());`

passport-config.js
`passport.use(new LocalStrategy(
    function(username, password, done) {    
      if(User[0].name == username) {        
        return done(null, JSON.stringify(User[0]));
      }
      else {
        return done(null, false, { message: 'Incorrect password.' });
      }
    }
  ));

  passport.serializeUser((user, done) => {
    done(null, user);    
  });  
  passport.deserializeUser((user, done) => { // never called if request from Vuejs, no problem if the request is sent through Postam 
    done(null, user);
  });

路由器:

router.post('/',  
  passport.authenticate('local', { 
    successRedirect: './',
    failureRedirect: '/',
    failureFlash: false 
  })
);

如果重定向成功:

router.get('/', (req, res) => {
    console.log(req.isAuthenticated()); // true if Postman, false if vuejs
    res.send('welcome !!!');
});

翻遍了整个网页,终于找到了解决办法。 首先,我必须明确要求 axios 使用凭据:

axios.defaults.withCredentials = true; // in the frontend

此配置产生了 CORS 问题。要修复它,我必须将我的 cors 中间件设置为以下服务器端:

app.use(cors({
    origin: 'http://localhost:8080', // frontend base url
    credentials: true
}));

现在可以正常使用了。 希望它能为面临同样问题的人节省时间...