CORS 使用“授权”标头和数据阻止 axios 请求

Posted

技术标签:

【中文标题】CORS 使用“授权”标头和数据阻止 axios 请求【英文标题】:CORS blocking axios request with 'Authorization' Header and Data 【发布时间】:2021-06-12 19:35:31 【问题描述】:

尝试从 Vue 应用程序(本地主机)向我的 nodejs API(本地主机和 heroku)发送 axios 发布请求。 如果发送的请求没有数据或标头,则接收响应没有问题,但是一旦添加它们,我就会收到以下错误:

Access to XMLHttpRequest at 'https://myapp.herokuapp.com/myendpoint' from origin 'http://localhost:8080'
has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No
'Access-Control-Allow-Origin' header is present on the requested resource.

按照类似问题的建议,我尝试了服务器端和客户端的不同选项,但没有成功。

客户请求:

        const apiUrl = 'https://myapp.herokuapp.com/myendpoint'
        //const apiUrl = 'http://localhost:5000/myendpoint'
        
        const token = Buffer.from(`$this.userid:$this.password`).toString('base64')
        const data = 
          'mydata': 'some data'
        

        axios.post(apiUrl, data, 
          headers: 
            Authorization: "Basic " + token 
          
        ).then( res => 
          console.log(res)
        ).catch( err => 
          console.log(err)
        )

服务器端点:

app.post("/myendpoint", (req, res) => 
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Methods", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");

    res.send('This is the API\'s response')    
)

我尝试的一些答案:Response to preflight request doesn't pass access control check Nodejs Express CORS issue with 'Access-Control-Allow-Origin' https://www.moesif.com/blog/technical/cors/Authoritative-Guide-to-CORS-Cross-Origin-Resource-Sharing-for-REST-APIs/ CORS authorization issue while using axios How to send authorization header with axios

【问题讨论】:

【参考方案1】:

我认为最好使用全局中间件定义cors。首先,使用npm i cors 安装cors

然后,我将展示一个如何使用该包的示例。

const express = require('express');
const cors = require('cors');

const app = express();

app.use(cors());

// your routes and things here...

然后,确保您的前端在 axios 请求中也使用设置为 truewithCredentials。这样做是为了确保正确发送标头。

axios.post(apiUrl, data, 
  headers: 
    Authorization: "Basic " + token 
  ,
  withCredentials: true,
).then(() => ...);

有时,如果您手动定义Access-Control-*,您可能会忘记一些事情。这就是为什么我建议你使用cors

【讨论】:

感谢您的回答,不知道为什么它被否决了...我还需要设置一些 cors 选项:` const corsOptions = origin: 'localhost:8080', credentials: true , 方法: ["POST"], maxAge: 3600 app.use(cors(corsOptions)) `

以上是关于CORS 使用“授权”标头和数据阻止 axios 请求的主要内容,如果未能解决你的问题,请参考以下文章

获取“被 CORS 策略阻止:请求的资源上不存在 'Access-Control-Allow-Origin' 标头。”使用 Axios 使用 MERN 堆栈

Axios 请求已被 cors 阻止,请求的资源上不存在“Access-Control-Allow-Origin”标头

被 CORS 策略阻止:预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段授权

被 CORS 阻止:预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段授权

Vuex Axios CORS 阻止访问控制允许来源

跨域请求被阻止:CORS 标头“Access-Control-Allow-Origin”缺失