使用 axios 从“/get”获取数据到“/”,但是得到 403 错误。 (快递、mysql、智威汤逊)

Posted

技术标签:

【中文标题】使用 axios 从“/get”获取数据到“/”,但是得到 403 错误。 (快递、mysql、智威汤逊)【英文标题】:Using axios to get data from "/get" to "/", but geting 403 error. (Express, mysql, JWT) 【发布时间】:2021-01-11 12:35:06 【问题描述】:

我想要做的是将 json 数据从“/get”获取到“/”,但我不确定为什么 axios 总是给我一个 403 错误。根据我的阅读,axios 不是问题,但 cors 是。我尝试了人们推荐的所有方法,但没有任何效果。我在我的代码中做错了什么?我还在标题中看到“Referrer Policy: strict-origin-when-cross-origin”,但我不确定这是否是导致此问题的原因。

const express = require("express");
const mysql = require("mysql2");
var app = express();
const bodyparser = require("body-parser");
const cors = require("cors");
const cookieParser = require("cookie-parser");
const expressSession = require("express-session")(
secret: "secret",
resave: false,
 saveUninitialized: false,
);
const passport = require("passport");

const jwt = require('jsonwebtoken');

app.use(passport.initialize());
app.use(passport.session());

app.use(bodyparser.json());
app.use(cors());

 app.use(bodyparser.urlencoded( extended: false ));
 app.use(express.json());
 app.use(cookieParser());
 app.use(expressSession);

 const axios = require('axios');

 var mysqlConnection = mysql.createConnection(
  host: "localhost",
  user: "root",
  password: "",
  database: "sys",
  multipleStatements: true,
);

 mysqlConnection.connect((err) => 
   if (!err) console.log("DB connection succeded.");
   else
     console.log(
       "DB connection failed \n Error : " + JSON.stringify(err, undefined, 2)
    );
);

 app.use(function(req, res, next) 
  res.header("Access-Control-Allow-Origin", "*");
  res.header('Access-Control-Allow-Methods', 'DELETE, PUT, GET, POST');
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
 next();
);

app.listen(5000, () =>
  console.log("Express server is runnig at port no : 5000")
);

 app.get("/get", authenticateToken, (req, res) => 

  jwt.verify(req.token, 'secretpassword', (err) => 
    if (err) 
      res.sendStatus(403);
     else 
      mysqlConnection.query("SELECT * FROM sys.jobs", (err, rows) => 
        if (rows === undefined) 
          res.send("Hello World!");
         else 
          res.send(rows);
        
      );
     

  );
);

 app.get("/", authenticateToken, (req, res) => 

  jwt.verify(req.token, 'secretpassword', async (err) => 
    if (err) 
      res.sendStatus(403);
     else 

    let response = await axios.get('http://localhost:5000/' +'get', 
      withCredentials: true,
      headers: 
        'Access-Control-Allow-Origin': '*',
        'Authorization': `Bearer 
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNjAwOTIyMTQ0LCJleHAiOjE2MDg2OTgxNDR9.aRsw- 
jEQJ-7mlO10nBKA5VT3IL7P0b9T9K0C8aT8sUs`
  
   
    );

       res.send(response.data);

    
  );
);

app.post("/login", async (req, res) => 
  try 
    const  email  = req.body;

    mysqlConnection.query("SELECT * FROM sys.users WHERE email = ?", [email], async (error, results) => 

      const id = results[0].id;
      const token = jwt.sign( id , "secretpassword", 
      expiresIn: '90d'
    );

  const cookieOptions = 
    expires: new Date(
      Date.now() + 90 * 24 * 60 * 60 * 1000
    ),
    secure: false,
    httpOnly: true
  

  res.cookie('jwt', token, cookieOptions);

  res.status(200).redirect("/get");
  );
  
  catch (error) 
  console.log(error);
 

);


function authenticateToken(req, res, next) 

  const bearerHeader = req.cookies.jwt;

  if (typeof bearerHeader !== 'undefined') 

  req.token = bearerHeader;

  next();
 else 

   res.sendStatus(403);
 

【问题讨论】:

【参考方案1】:

使用cors 模块

const cors = require('cors')

//... your app instance code here

app.use(cors())

【讨论】:

如果你看看我的代码,我就是这么做的。它不工作。 您正在覆盖 cors 标头,请删除并检查并提供正确的错误消息 你的意思是摆脱这个。 app.use(function(req, res, next) res.header("Access-Control-Allow-Origin", "*"); res.header('Access-Control-Allow-Methods', 'DELETE, PUT , GET, POST'); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); next(); );

以上是关于使用 axios 从“/get”获取数据到“/”,但是得到 403 错误。 (快递、mysql、智威汤逊)的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.7 - 如何使用 axios.get 从 API 检索数据?

Vue Js 在我用 Axios get 调用的函数内部,将传入的数据打印到数组中

使用 axios.get 方法加载页面时,如何仅从 API 获取数据一次?

无法使用 api 从 axios 获取数据 - vue js

Axios.get 返回纯 html 而不是 JSON 返回数据

如何从我得到的数组中获取特定的数组元素作为调用 axios.get() 调用的函数的响应 [重复]