0

0

解决React中Fetch API的CORS授权头部问题

聖光之護

聖光之護

发布时间:2025-11-16 13:02:18

|

371人浏览过

|

来源于php中文网

原创

解决react中fetch api的cors授权头部问题

本文旨在解决React应用中,使用Fetch API访问外部API时遇到的CORS策略问题,特别是涉及授权头部(Authorization)的场景。核心问题通常源于fetch请求选项的误用,如将mode: 'no-cors'错误放置于headers对象内,以及将授权头部错误命名为Authentication而非正确的Authorization。教程将指导开发者正确配置fetch请求,确保授权令牌的有效传递,从而成功绕过CORS限制并获取数据。

在现代Web开发中,前端应用(如基于React的项目)经常需要与部署在不同域的后端API进行交互。这种跨域请求受限于浏览器的同源策略(Same-Origin Policy),为了安全起见,浏览器会阻止来自不同源的HTTP请求。跨域资源共享(CORS, Cross-Origin Resource Sharing)机制正是为了解决这一问题而生,它允许服务器明确地授权特定源的跨域请求。

当我们在React组件中使用fetch API向外部API发送带有授权信息的请求时,如果配置不当,很可能会遇到CORS策略错误,例如常见的Request header field authentication is not allowed by Access-Control-Allow-Headers in preflight response。这个错误通常意味着浏览器在发送实际请求之前,会先发送一个“预检请求”(preflight request,通常是OPTIONS方法),以确认服务器是否允许该源、该方法和该自定义头部(如Authorization)的请求。如果服务器的响应头中不包含相应的许可,浏览器就会阻止后续的实际请求。

fetch API中的常见配置误区

在处理带有授权头部的跨域请求时,开发者常犯以下两个错误:

1. mode 属性的错误放置与不当使用

fetch API的mode属性用于控制请求的CORS模式。常见的模式包括cors(默认)、no-cors和same-origin。

一个常见的错误是将mode属性放置在headers对象内部,如下所示:

// 错误示例:mode 属性位置不正确
fetch('https://api.airtable.com/v0/my_data_base', {
    headers: {
        mode: 'no-cors', // 错误:mode 不属于 headers
        Authentication: 'Bearer my_token',
    },
})

mode属性是fetch请求的顶级选项之一,应与headers对象平级。

代悟
代悟

开发者专属的AI搜索引擎

下载

此外,mode: 'no-cors'虽然听起来可以绕过CORS,但它有严格的限制。当使用no-cors模式时,请求会被发送,但浏览器会阻止JavaScript代码访问响应内容(例如,你无法读取响应的状态码或正文)。这对于需要处理API响应的场景(如获取数据)是不可接受的。对于需要发送自定义头部(如Authorization)的请求,通常应使用默认的mode: 'cors',并确保后端API正确配置了CORS响应头。

2. 授权头部名称的拼写错误

另一个常见但关键的错误是授权头部的名称拼写。标准的HTTP授权头部是Authorization,而不是Authentication。

// 错误示例:授权头部名称拼写错误
fetch('https://api.airtable.com/v0/my_data_base', {
    headers: {
        Authentication: 'Bearer my_token', // 错误:应为 Authorization
    },
})

当浏览器发送预检请求时,它会检查服务器的Access-Control-Allow-Headers响应头中是否包含了所有自定义请求头部。如果前端发送的是Authentication,而后端只配置了允许Authorization,那么预检请求就会失败。

正确配置 fetch API进行跨域授权请求

结合上述分析,修复这些问题相对直接。以下是正确的fetch请求配置示例:

import { FC, useEffect } from 'react';

const Collection: FC = () => {
    useEffect(() => {
        const fetchData = async () => {
            try {
                const response = await fetch('https://api.airtable.com/v0/my_data_base', {
                    method: 'GET', // 明确指定请求方法,默认为GET
                    headers: {
                        'Content-Type': 'application/json', // 通常需要指定内容类型
                        'Authorization': 'Bearer my_token', // 正确的授权头部名称
                    },
                    // mode: 'cors' 是默认值,通常不需要显式设置
                });

                if (!response.ok) {
                    throw new Error(`HTTP error! status: ${response.status}`);
                }

                const data = await response.json();
                console.log(data);
            } catch (error) {
                console.error("Fetch error:", error);
            }
        };

        fetchData();
    }, []); // 依赖数组为空,只在组件挂载时执行一次

    return <div>Collection Page Component</div>;
};

export default Collection;

代码解析:

  1. Authorization: 'Bearer my_token': 这是最关键的修正。将授权头部名称从Authentication更正为标准的Authorization。Bearer是令牌类型,后面跟着实际的访问令牌。
  2. mode 属性: 在这个修正后的代码中,mode属性被省略了。这是因为fetch的默认mode就是'cors',它允许发送自定义头部并接收响应。对于需要授权的跨域请求,'cors'模式是正确的选择。
  3. Content-Type: 虽然不是直接解决CORS问题的关键,但为了API交互的规范性,通常会包含Content-Type头部,例如'application/json',表明请求体的内容类型。
  4. 异步/等待 (async/await): 为了更好地处理异步操作和错误,这里将.then().catch()链式调用改写为更现代的async/await语法。
  5. 错误处理: 增加了对response.ok的检查,以便在HTTP状态码表示错误时抛出异常,并使用try...catch捕获潜在的网络或解析错误。

注意事项与最佳实践

  • 服务器端CORS配置: 即使前端fetch配置正确,如果后端API服务器没有正确配置CORS响应头(例如,Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers),CORS问题仍然会存在。请确保API提供者已正确配置其服务器。
  • 令牌安全: 访问令牌(my_token)不应硬编码在前端代码中。在实际应用中,它们通常通过登录流程动态获取,并安全地存储(例如,使用HTTP Only的Cookie或Web Storage,并注意XSS风险)。
  • 预检请求: 带有自定义头部(如Authorization)的跨域请求,浏览器会先发送一个OPTIONS预检请求。服务器必须正确响应这个预检请求,告知浏览器允许的源、方法和头部。
  • 开发环境代理: 在开发环境中,如果后端API无法修改CORS配置,可以考虑使用开发服务器(如Webpack Dev Server或Vite)的代理功能,将前端请求转发到后端,从而绕过浏览器的CORS限制。

总结

解决React中fetch API的CORS授权头部问题,关键在于理解CORS机制和fetch请求选项的正确使用。核心修正包括:将授权头部从Authentication更正为标准的Authorization,并确保mode属性被正确理解和使用(通常默认的'cors'模式即可,避免将'no-cors'错误放置于headers中)。通过这些调整,开发者可以确保授权令牌正确传递,从而成功与需要认证的外部API进行交互。同时,不要忘记后端API的CORS配置也是解决问题的关键一环。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

452

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

331

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

176

2023.12.20

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6496

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

366

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

441

2024.02.23

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

4

2026.03.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.8万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号