带有基本 HTTP 身份验证的 CORS

Posted

技术标签:

【中文标题】带有基本 HTTP 身份验证的 CORS【英文标题】:CORS with basic HTTP Authentication 【发布时间】:2018-01-24 11:16:08 【问题描述】:

我在使用 CORS 的基本 HTTP 身份验证时遇到了一些问题:我们有一个 node express Web 服务器 (UI),从 Java Dropwizard (Jersey) 服务器调用 HTTP API,在同一主机上运行。

API 受到 HTTP 基本身份验证的保护,我在我的 Jersey 服务器上实现了以下过滤器(摘自这篇文章:How to handle CORS using JAX-RS with Jersey):

@Provider
public class CORSFilter implements ContainerResponseFilter 

    @Override
    public void filter(ContainerRequestContext request,
                                         ContainerResponseContext response) throws IOException 
        response.getHeaders().add("Access-Control-Allow-Origin", "http://localhost:9000");
        response.getHeaders().add("Access-Control-Allow-Headers",
                "Cache-Control, Pragma, Origin, Authorization, Content-Type, X-Requested-With");
        response.getHeaders().add("Access-Control-Allow-Credentials", "true");
        response.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
    

但是,当我尝试加载 Web UI 时,我的控制台会给出以下输出:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:9000/intraday/parameters. (Reason: CORS header ‘Access-Control-Allow-Origin’ does not match ‘http://localhost:9000’)

我无法理解这个错误。显然来源是相同的 (http://localhost:9000),所以我不明白为什么它不匹配。

我还确保使用 HTTP 代码 200 响应任何预检 OPTIONS 请求。

【问题讨论】:

也许这对你有帮助:***.com/questions/28065963/… @sascha10000 您提供的链接与我在问题中已经链接到的帖子相同。 哦,抱歉,我真的没有看到这是一个链接... 【参考方案1】:

根据问题中的描述,听起来 Java Dropwizard (Jersey) 服务器在 http://localhost:9000 上运行,而 node express Web 服务器 (UI) 在另一个来源运行。

无论如何,您必须将 Jersey 服务器上 CORSFilter 代码中的 Access-Control-Allow-Origin 响应标头的值设置为发出请求的前端 javascript 代码的来源(显然是节点服务器)。所以如果是,例如,http://localhost:12345,那么:

response.getHeaders().add("Access-Control-Allow-Origin", "http://localhost:12345");

无论如何,它肯定不是http://localhost:9000,因为如果前端JavaScript 编码请求,您的浏览器不会发出“不允许读取http://localhost:9000/… 的远程资源”的错误消息发送自 http://localhost:9000 提供服务——因为在这种情况下,它不是跨域请求,您的浏览器也不会阻止对响应的访问。

【讨论】:

以上是关于带有基本 HTTP 身份验证的 CORS的主要内容,如果未能解决你的问题,请参考以下文章

CORS 和 HTTP 基本身份验证

AngularJS $http、CORS 和 Jersey 的基本身份验证

在 Angular 2 中使用基本身份验证预检 CORS 请求

带有 Windows 身份验证的 Web api 中的 Cors 问题

ASP.NET Core:带有 OPTIONS 异常的 Windows 身份验证(CORS 预检)

带有 Windows 身份验证的 CORS