3

我正在开发 SPA MEAN 应用程序,我正在针对 Apiary 模拟 API 开发它,该 API 设置了以下 CORS 标头:

Access-Control-Allow-Methods → OPTIONS,GET,HEAD,POST,PUT,DELETE,TRACE,CONNECT
Access-Control-Allow-Origin → *
Access-Control-Max-Age → 10

一切正常,angular 可以使用 $http angular 服务来访问它。但是,在添加 Stormpath Angular SDK 后,所有这些请求都失败并出现以下错误:

XMLHttpRequest cannot load https://xxx.apiary-mock.com/workshops?type=favourite. Credentials flag is 'true', but the 'Access-Control-Allow-Credentials' header is ''. It must be 'true' to allow credentials. Origin 'http://localhost:8000' is therefore not allowed access.

我试图弄清楚为什么这些请求被拒绝以及在什么时候添加这些标头?

4

3 回答 3

2

每当您从一个域(例如localhost:8080)提供 SPA 客户端并且您希望该客户端访问另一个域(xxx.apiary-mock.com)上的 API 时,浏览器都会要求服务器域正确添加CORS标头。

如果客户端域和服务器域不同,浏览器的安全模型要求服务器通过设置Access-Control-Allow-Origin响应头(除了其他相关Access-Control-*头)来指示哪些客户端域可以访问服务器。

于 2015-11-09T18:16:41.220 回答
2

感谢您发现此问题。Stormpath Angular SDK 确实有一个拦截器,它withCredentials: true为所有请求设置标志。请在此处查看代码。

目的是确保始终发送我们的身份验证 cookie,即使在跨域情况下也是如此。但是,如果您的 Angular 应用程序正在与不需要发送 cookie 的其他 API 通信,我可以看到这将是多么有问题。

作为一种解决方法,您可以通过简单地添加另一个拦截器来覆盖我们的拦截器:

angular.module('myapp', [
  'stormpath',
  'stormpath.templates'
]).config(function ($httpProvider) {
  $httpProvider.interceptors.push(function() {
    return {
      request: function(config) {
        config.withCredentials=false;
        return config;
      }
    };
  });
});

我创建了一个问题来讨论更好的解决方案:https ://github.com/stormpath/stormpath-sdk-angularjs/issues/72

于 2015-11-10T19:08:07.760 回答
0

我有如何解决它将这些标题添加到蜂房:

+ Response 200 (application/json)

    + Headers

            Access-Control-Allow-Credentials: true
            Access-Control-Allow-Methods: OPTIONS,GET,HEAD,POST,PUT,DELETE,TRACE,CONNECT
            Access-Control-Allow-Origin: http://localhost:8000

我仍在试图弄清楚 Stormpath 在哪里需要这些标头。

于 2015-11-08T12:21:15.383 回答