护照本地身份验证:deseralizeUser从未调用

时间:2019-03-23 22:02:35

标签: javascript node.js vue.js passport.js

我正在测试应用程序中测试护照本地身份验证,但我不明白为什么在通过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 !!!');
});

1 个答案:

答案 0 :(得分:0)

浏览整个网络后,我终于找到了解决方案。 首先,我必须明确要求axios使用凭据:

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

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

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

现在可以正常工作了。 希望这可以节省面临同样问题的人们的时间...