AugularJS 中的飞行前 OPTIONS 请求未通过授权标头

Posted

技术标签:

【中文标题】AugularJS 中的飞行前 OPTIONS 请求未通过授权标头【英文标题】:Pre-flight OPTIONS request in AugularJS not passing authorization header 【发布时间】:2015-12-14 11:15:03 【问题描述】:

我在堆栈溢出和谷歌上查看了许多类似的问题,但没有建议的解决方案对我有用。

情况如下:

我正在尝试使用以下请求连接到私有 api:

发布https://api.domain.com/oauth/token

我还需要传递 Authorization 和 Content-Type 标头。

问题是飞行前的 OPTIONS 请求没有显示这两个标头,这使得 api 返回一个 401 错误。

这已在 Firefox 和 Chrome 中进行了测试。

如果我尝试使用 HTTP 而不是 HTTPS,它会自动重定向到 HTTPS。

奇怪的是 Postman 工作的路线完全相同。 Postman 在 OPTIONS 请求中添加 Authorization 标头,因此问题不在服务器端。

如何确保 Angular $http 像 Postman 一样添加 Authorization 标头?

谢谢

【问题讨论】:

Postman 不受 CORS 限制。您是否控制您尝试访问的 api? @charlietfl 不幸的是没有 【参考方案1】:

我一直在纠结同样的问题,但终于解决了。

您无法控制浏览器预检 OPTIONS 请求,因此我不会尝试让浏览器添加它。 CORS preflight OPTIONS 请求不应该被认证,服务器应该只返回 200 OK 而不需要 Authorization & Content-Type。

在您的后端应用程序中,确保安全配置允许 OPTIONS 请求通过。在我的例子中,它是一个 Java 应用程序,所以这个配置在 web.xml 中。最后在我的后端代码中,如果我看到 OPTIONS 方法,我会回复 200,下面是 Java 和 Jersey REST 的示例

public class CORSRequestFilter implements ContainerRequestFilter


@Override
public ContainerRequest filter(ContainerRequest request) 

    if (request.getMethod().equals( "OPTIONS" ) ) 

        ResponseBuilder sb = Response.status(Response.Status.OK);

        throw new WebApplicationException(sb.build());
    


    return request;
   

【讨论】:

以上是关于AugularJS 中的飞行前 OPTIONS 请求未通过授权标头的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat Jersey 在“OPTIONS”飞行前请求中阻止服务器

Angular $http 未在 OPTIONS 飞行前发送标头

在 IdentityServer3 中处理 CORS 之前发送的飞行前 OPTIONS 请求

如何在浏览器的控制台中查看 CORS 飞行前 OPTIONS 请求?

在Chrome中取消了飞行前OPTIONS请求(已支持CORS)

HTTP OPTIONS 飞行前请求加载已取消,Chrome 中处于待处理状态