Javascript 如何使用Passport本地身份验证为Node.js应用程序的Axios请求形成身份验证头?

Javascript 如何使用Passport本地身份验证为Node.js应用程序的Axios请求形成身份验证头?,javascript,node.js,axios,passport.js,passport-local,Javascript,Node.js,Axios,Passport.js,Passport Local,我有一个node.js应用程序,正在开发一个单独的单页应用程序(最终将转换为Android和iOS原生应用程序)。我正在node.js应用程序上设置一个API,正在努力进行身份验证。node.js应用程序正在使用passport local mongoose进行身份验证,我将用户数据存储在MongoDB后端。对于测试/开发,单页应用程序正在http://localhost:1234/ 我的端点看起来像: exports.getDevicesAPI = async (req, res) =>

我有一个node.js应用程序,正在开发一个单独的单页应用程序(最终将转换为Android和iOS原生应用程序)。我正在node.js应用程序上设置一个API,正在努力进行身份验证。node.js应用程序正在使用
passport local mongoose
进行身份验证,我将用户数据存储在MongoDB后端。对于测试/开发,单页应用程序正在
http://localhost:1234/

我的端点看起来像:

exports.getDevicesAPI = async (req, res) => {
  res.header('Access-Control-Allow-Origin', req.headers.origin);
  res.header('Access-Control-Allow-Methods', 'GET, POST');
  res.header('Access-Control-Allow-Headers: Authorization');
  const devices = await Device.find({ owner: req.user._id });
  res.json(devices);
};
我可以
得到
这样的东西没有问题:

const axios = require('axios');
const url = 'http://localhost:7777/api/devices';

function getDevices() {
  axios
    .get(url)
    .then(function(response) {
      console.log(response);
    })
    .catch(function(error) {
      console.log(error);
    });
}
我想添加
authenticate=passport.authenticate('header',{session:false,failWithError:true})
在服务器端提供身份验证,但以下情况导致跨源请求被阻止:同源策略不允许在服务器端读取远程资源http://localhost:7777/api/devices. (原因:CORS标题“访问控制允许原点”缺失)

路线(用于测试):


我缺少什么?

您在CORS(跨源资源共享)限制方面遇到问题。了解更多关于CORS的信息

我相信这部分代码是用来处理CORS的:

exports.getDevicesAPI = async (req, res) => {
  // ...
  res.header('Access-Control-Allow-Origin', req.headers.origin);
  res.header('Access-Control-Allow-Methods', 'GET, POST');
  res.header('Access-Control-Allow-Headers: Authorization');
  // ...
};

但是,这里的错误是,这些CORS头的设置绑定到一个路由,即
getDevicesAPI
路由,该路由不应该被绑定。对于可能修改另一来源中的资源的请求(例如发送到
getDevicesAPI
路由),浏览器将首先使用
选项
Http方法发送飞行前请求,然后再发送实际请求,对飞行前请求的响应是需要设置必要的CORS响应头的地方。你可以找到飞行前请求的解释

我通常会在其他路由之上添加这样的中间件:

router.all('*', (req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
  res.header('Access-Control-Allow-Headers', '*');
  next();
});

您能否发布设置由
getDevicesAPI
处理的路由的代码?@ChrisG已添加。在最初的开发/测试过程中,我对
GET
POST
使用了相同的路径。有两个问题:1)
res.header('Access-Control-Allow-Headers:Authorization')
将不起作用,您需要像使用其他两个参数一样使用两个参数。2)
axios.post
使用数据作为第二个参数,头/选项作为第三个参数,因此您需要
axios.post(url,{},axioconfig)
来解决CORS问题。对于问题的真正症结,我将提出一个新问题,即如何使用passport通过请求头对用户进行身份验证。
exports.getDevicesAPI = async (req, res) => {
  // ...
  res.header('Access-Control-Allow-Origin', req.headers.origin);
  res.header('Access-Control-Allow-Methods', 'GET, POST');
  res.header('Access-Control-Allow-Headers: Authorization');
  // ...
};

router.all('*', (req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
  res.header('Access-Control-Allow-Headers', '*');
  next();
});