尝试执行 localhost API 时在 ReactJS 应用程序中出现 CORS 错误

Posted

技术标签:

【中文标题】尝试执行 localhost API 时在 ReactJS 应用程序中出现 CORS 错误【英文标题】:Getting CORS error in ReactJS app when attempting to execute localhost API 【发布时间】:2020-08-27 04:38:36 【问题描述】:

我正在尝试创建一个简单的应用程序来进行一些 AES 加密(工作所需)。我在 ReactJS 中创建了一个小应用程序,它有一个纯文本文本框、一个调用 encrypt 方法的按钮,以及一个显示加密值的只读文本框。

加密方法调用我用 ASP.NET Core(目前位于本地)编写的 API 来测试加密。当我在 Postman 和/或浏览器中执行时,API 成功加密并返回加密值,但是当我通过我的 React 应用程序执行时,它会引发 CORS 错误。

我在创建 API 和 React 方面都非常陌生,所以如果修复非常简单,请提前道歉。

这是我在 API 项目中的Startup 类:

public class Startup

    public Startup(IConfiguration configuration)
    
        Configuration = configuration;
    

    public IConfiguration Configuration  get; 

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    
        services.AddCors();
        services.AddControllers();
    

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    
        app.UseCors(
            options => options.WithOrigins("https://localhost:5001/encryption/encrypt").AllowAnyMethod()
        );

        if (env.IsDevelopment())
        
            app.UseDeveloperExceptionPage();
        

        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        
            endpoints.MapControllers();
        );

    

然后这是我在 React 应用程序中的 encrypt 方法:

encrypt() 
var plainText = this.textToEncrypt.value;
console.log(plainText);

var requestOptions = 
  method: 'GET',
  headers: 
    'Access-Control-Allow-Origin' : '*'
  
;

fetch("https://localhost:5001/encryption/encrypt?plainText=" + plainText, requestOptions)
  .then(response => response.text())
  .then(data => this.setState( encryptedText: data.value ))
  // .then(result => console.log(result))
  .catch(error => console.log('error', error));

这是来自浏览器控制台的错误:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://localhost:5001/encryption/encrypt?plainText=sample%20text. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

【问题讨论】:

查看您的网络应用程序和 api 请求中的网络标头。如果您没有看到Access-Control-Allow-Origin: *,那么您需要再看一下您的配置。 Arm 的回答中描述的代理方法是一种很好的解决方法,可以避免调整网络标头,这对于生产环境来说是一种不安全的方法。 和 fwiw,Access-Control-Allow-Origin 是响应标头,而不是请求标头,因此不需要将其包含在您的 fetch 中(它不会有任何影响)。跨度> 【参考方案1】:

这不是一个完美的方法,因为这绝对不是您想要在生产环境中解决问题的方式,但出于开发目的,您可以尝试一下。

if (env.IsDevelopment())

    app.UseCors(
        options => options.WithOrigins("*").AllowAnyMethod()
    );

这将代替您当前的UseCors 实现。您当前实现的问题是(如果语法正确)只允许来自其自身的 CORS。您需要允许来自节点服务器源(或运行您的 Web 应用程序的任何域/端口)的 CORS。由于您没有在帖子中指出,* 涵盖了所有内容(非常不安全,提醒一下,对于生产而言)。

【讨论】:

这实际上是我需要做的,所以我至少可以继续。当我们需要时,让实际的开发人员找出生产方法:)【参考方案2】:

我不知道我们是否有同样的 CORS 问题,但是一旦我通过这些更改解决了这个问题: 在 package.json 文件中添加这一行:

"proxy": "http(s)://backend.url/api",

和/或通过在 .env 文件中禁用主机检查:

DANGEROUSLY_DISABLE_HOST_CHECK=true

【讨论】:

如果您使用代理方法,他需要更改他的获取 URL 以指向运行他的 Web 应用程序的(可能是节点)服务器,而不是运行他的 API 的(可能是 IIS express)服务器以及调整 URL 路径以包含代理子文件夹(即:在您的示例中为 /api)。

以上是关于尝试执行 localhost API 时在 ReactJS 应用程序中出现 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 JAVA 通过 REST API 集成 Keycloak 时在 toRepresentation() 处获取 404

调用 API 时在哪里使用并发

获取问题-不支持的方法:在测试 API Gateway API 时在邮递员中获取

我需要在启动时在 ASP .Net Core 3.1 Web API 中执行异步方法

向 API 请求 formData,上传图片时在 axios 中出现“网络错误”

使用动作约束时在 MVC 6 中使用 Swagger 的多个 Api 版本