繁体   English   中英

Node.js,Vue.js和Passport.js。 .isAuthenticated()总是返回false? Axios标题可能吗?

[英]Node.js, Vue.js and Passport.js. .isAuthenticated() always returns false? Axios headers possibly?

我正在将一个项目转移到Vue.js,我无法获取任何中间件来检查用户是否已登录或检查用户对所用内容的所有权。 经过无休止的搜索,我认为问题是我从客户端发送到服务器的标头不包含护照序列化用户或其他东西? 我怎样才能做到这一点?

这是我在后端的登录路线:

      router.post("/login", function (req, res, next) {
    if (!req.body.username || !req.body.password) {
      res.send("Error");
    } else if(req.body.username.length > 40 || req.body.password.length > 40){
      res.send("Error");
    } else if (req.body.username) {
      req.body.username = req.body.username.toLowerCase();
      next();
    }
  }, passport.authenticate('local', {
    failureRedirect: '/login'
  }), function(req, res){
        User.findById(req.user.id, function(err, user){
          if(err){
            res.send("User not found");
          } else {
            res.send(user.toJSON());
          }
        })
  });

这是我在客户端的登录页面:

          async login () {
          const response = await AuthenticationService.login({
                username: this.username,
                password: this.password,
            })
            if(response.data == "Error"){
                this.$router.push({
                    name: 'login'
                })
            } else {
            this.$store.dispatch('setUser', response.data._id);
            this.$router.push({
                name: 'home'
            })
            }
        }

以下是AuthenticationService.login引用的axios调用:

    login(credentials){
    return Api().post('login', credentials);
},

Api来自:

import axios from 'axios';

 export default function(){
   return axios.create({
      baseURL: `http://localhost:8081/`
   });
  }

那么在用户通过身份验证后,如何让前端向后端发送正确的标头? 正如您所看到的,我将用户ID存储在vuex状态,但我不认为用于确认所有权以及用户是否登录是安全的,对吧? 或者是吗? 我可以轻松地在请求中发送它,是吗? 我觉得这不够安全,但我正在谈论的是Idk。

编辑:这是app.js中的护照设置

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cors());
app.use(flash());
app.use(cookieParser());

app.use(express.session({ //5a6ba876578447262893ac69
    secret: "sessionSecret",
    resave: false,
    saveUninitialized: false
  }));
app.locals.moment = require('moment');
app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

您的问题是因为您的前端和后端位于不同的域上。

passport.session() / express.session()用于维护用户会话的cookie限定在特定域中。

当您在受保护资源上调用axios.get()时,axios将不会发送或接收cookie,因为localhost:8080localhost:8081的不同域。

尝试axios.get('/path/to/your/resource', { withCredentials: true })axios.post('/login', { username, password }, { withCredentials: true })

只要您使用AJAX进行这些调用,即使没有Vue,这也会存在。

requests.js

 let axiosConfig = { withCredentials: true, headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': 'http://localhost:3000/', 'Access-Control-Allow-Methods': 'GET,PUT,POST,DELETE' } } 

server.js

 var express = require('express'); var app = express(); var cors = require('cors'); app.use(cors({credentials: true, origin: 'http://localhost:8080'})) 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM