你如何保护来自 React 应用程序的 Web 服务调用?

How do you secure a web service call from a React App?

我刚开始使用 React,看看有什么大惊小怪的。在遇到 JSON Web 服务和安全性之前,我印象非常深刻。我正在尝试 fetchaxios

所以有两个问题和一些背景知识。

我可以理解 CORS 等问题,我可以找到很多文章告诉我问题是什么以及为什么,我完全明白了。我只是找不到任何解决方案。

背景

每一个教程、文章和示例都使用本地 JSON 文件或外部不相关 URL 来获取 JSON 数据这一事实似乎证明了这一点. 此外,我找不到任何甚至暗示它甚至可能的东西,这会引发安全问题。

我的安全首选是 cookie。简单直接和健壮。我的意思是,如果 Microsoft 和 Google 使用这种方法,它会取得一些进展。

所以还有一个安全问题是

我已经阅读并观看了几个小时的教程和文章,none 解释了这部分内容。它们都很棒,并向您展示了如何开始使用 React,但我正在本地同时开发 React 和 Web 服务。我对 C# 和 PHP 项目使用了相同的方法,并且都完美无缺地工作。

我很高兴得知我被误解了或者我完全错了,但我会要求您提供解决方案或 link 文章以支持它。

显然,如果我找到解决方案,我会 post 在这里。

You can't seemingly have your react app on and your web service both running on http://localhost it just won't work.

HTTP 服务器完全有能力为同一来源的不同路径提供不同的资源。

例如,/api/ 路径可以由某些服务器端编程处理,而其他所有内容都作为静态文件提供。

然后您只需将生产文件(npm run build 通常设置为生成)部署到一个目录,该服务器将在该目录中获取并设置它们。

在处理本地开发环境时,这显然很尴尬,因为通常使用支持热重载等的 React Development Server 更方便。

在这种情况下,我会想到三种解决方案。在它们中的每一个中,您将 运行 两个 HTTP 服务器(API 和 React Development Server)在不同的端口(例如 80 和 3000)上。

为本地开发设置 CORS。不过,这确实让处理 cookie 变得更加尴尬。

设置 React Development Server 以使用 the options in the configuration file 代理 API。

执行相反的操作并配置您的开发 API 服务器以代理到 React 开发服务器。

您可以使用反向代理服务器。如果您正在开发,请使用 webpack-dev-server, See here 等开发服务器,让代理服务器将请求发送到安全的远程服务器,而不是您的应用程序。 在生产中,您需要使用生产就绪的反向代理服务器,例如nginx。 然后对于您的应用程序,不再有 CORS 问题。

解决了这个问题https://enable-cors.org/server_iis7.html (已更新以支持 POST)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="Access-Control-Allow-Origin" value="*" />
                <add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS, DELETE" />
                <add name="Access-Control-Max-Age" value="3600" />
                <add name="Access-Control-Allow-Headers" value="Content-Type, Origin, Cache-Control, X-Requested-With" />
                <add name="Access-Control-Allow-Credentials" value="true" />       
            </customHeaders>
    </httpProtocol>
    </system.webServer>
</configuration>

快速重置 IIS,然后我们开始