我正在测试应用程序中测试护照本地身份验证,但我不明白为什么在通过Postman发送发帖请求时不调用deserializeUser,而在发帖请求来自我的前端(Vuejs)时却从不调用deserializeUser的原因。 我想我的会话管理方式有问题,但是我不知道...有人可以帮我理解吗?
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 !!!');
});
答案 0 :(得分:0)
浏览整个网络后,我终于找到了解决方案。 首先,我必须明确要求axios使用凭据:
axios.defaults.withCredentials = true; // in the frontend
此配置产生了CORS问题。要解决此问题,我必须将cors中间件设置为以下服务器端:
app.use(cors({
origin: 'http://localhost:8080', // frontend base url
credentials: true
}));
现在可以正常工作了。 希望这可以节省面临同样问题的人们的时间...