当前位置: 首页 > 知识库问答 >
问题:

在Ionic应用程序中一起使用CORS和CSRF

危卜鹰
2023-03-14

我正在使用Ionic Framework开发一个android应用程序,该应用程序基于我使用Jhipster开发的AngularJS网站。由于我的web应用程序中已经运行了服务器代码,我选择了Ionic作为UI,并在需要时调用服务器,但我的开发环境中存在一些问题。

  1. 当我使用Ionic服务运行我的应用程序时,我需要使用CORS向服务器发出请求。
  2. 我的Web应用程序是使用带有Spring Security的CSRF令牌开发的

我使用的是这样配置的Apache CORS过滤器:

private void initCORSFilter(ServletContext servletContext, EnumSet<DispatcherType> disps) {
    FilterRegistration.Dynamic corsFilter = servletContext.addFilter("cors", new CorsFilter());
    Map<String, String> parameters = new HashMap<>();
    parameters.put("cors.allowed.origins", "http://localhost:3000");
    parameters.put("cors.allowed.headers", "x-auth-token, x-requested-with, Content-Type, Accept, cache-control, x-csrf-token, Origin, Access-Control-Request-Method, Access-Control-Request-Headers");
    parameters.put("cors.allowed.methods", "POST, PUT, GET, DELETE");
    parameters.put("cors.exposed.headers", "Access-Control-Allow-Origin, Access-Control-Allow-Credentials");
    parameters.put("cors.support.credentials", "true");
    corsFilter.setInitParameters(parameters);
    corsFilter.addMappingForUrlPatterns(disps, true, "/*");
}

然后我使用angular-csrf-cross-domain插件来帮助处理跨域csrf请求:

.config(function ($urlRouterProvider,csrfCDProvider) {
    $urlRouterProvider.otherwise('/');
    //enable CSRF
    csrfCDProvider.setHeaderName('X-CSRF-TOKEN');
    csrfCDProvider.setCookieName('CSRF-TOKEN');
});

然后我尝试向我的本地服务器发送一个发布请求:

angular.module('consamiApp')
.factory('Register', function ($resource) {
    //globalURL is https://localhost:8080
    return $resource(globalURL+'api/register', {}, {
    });
});
.
.
.
createAccount: function (account, callback) {
    var cb = callback || angular.noop;

    return Register.save(account,
        function () {
            return cb(account);
        },
        function (err) {
            this.logout();
            return cb(err);
    }.bind(this)).$promise;
}

然而,我在firefox控制台上看到了这条消息:

跨源锁定请求:相同源策略(相同源策略)阻止读取中的远程资源https://localhost:8080/api/register.(原因:CORS标题“访问控制允许来源”不存在)

新信息

当我提交正在测试的表单时,AngularJs向服务器发出2个CORS请求:OPTIONS和POST,请求的结果是200 OK和403 Forbidden。以下是两个请求和响应的标题:

OPTIONS请求标头:

Host: localhost:8080
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Origin: http://localhost:3000
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

选项 答案标题:

Access-Control-Allow-Origin: http://localhost:3000
Content-Length: 0
Date: Tue, 30 Jun 2015 22:07:58 GMT
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=485A653AEAC8B8756DD3057BBF7FB862; Path=/; Secure; HttpOnly
CSRF-TOKEN=e8b3396c-63b2-47bf-9ad6-c1454628eb3b; Path=/
X-Application-Context: application:dev:8080
access-control-allow-credentials: true
access-control-allow-headers: origin,access-control-request-headers,x-requested-with,x-csrf-token,content-type,access-control-request-method,cache-control,x-auth-token,accept
access-control-allow-methods: POST
access-control-max-age: 1800

POST请求标头:

Host: localhost:8080
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0
Accept: application/json, text/plain, */*
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/json;charset=utf-8
Referer: http://localhost:3000/
Content-Length: 109
Origin: http://localhost:3000
Cookie: _ga=GA1.1.123103160.1428358695; connect.sid=s%3AwD4KP4WBfhGO0JpFND3LpCzW.augts9fos9NMaZw%2B7XrNuilgaM8ocwSxaEUeDlIaVJ4; JSESSIONID=93200F4F4AFCEB28F10B130841808621
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

POST答案标题:

Content-Type: application/json;charset=UTF-8
Date: Tue, 30 Jun 2015 22:07:58 GMT
Server: Apache-Coyote/1.1
Transfer-Encoding: chunked

有什么我没注意到的吗?Ionic的官方博客说我不应该担心部署应用程序时的CORS问题,但是至少对于测试来说,我真的需要解决这个问题。你能给我一些选择吗?

共有3个答案

姜晨
2023-03-14

CORS 规范是全有或全无的。它仅支持 *、null 或确切的域:http://www.w3.org/TR/cors/#access-control-allow-origin-response-header

我认为您不能指定端口号作为其值。

艾自强
2023-03-14

当我编辑问题并看到带有 HttpOnly 子句的 OPTIONS 响应标头时,我开始相信问题出在我在开发环境中使用的自签名证书上。

设置Cookie:JSESSIONID=485A653AEAC8B8756DD3057BBF7FB862;路径=/;保护仅限Http

所以我决定在 Web 服务器中禁用 https 协议,它工作正常。感谢您的帮助。

谭景福
2023-03-14

自cordova 5.0.0以来,您是否安装并配置了CORS查询所必需的cordova插件白名单

安装它:

cordova plugin add cordova-plugin-whitelist

配置配置.xml

您可以使用*保留当前设置,或者更改为更严格的规则

在index.html上添加一个html策略,你也应该添加一个策略。授权一切,这是:

 <meta http-equiv="Content-Security-Policy" content="default-src *;
 style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'
 'unsafe-eval'"

要验证您是否正确安装了插件,请使用以下命令将其签入 cordova 插件:

cordova plugins 

你会看到科尔多瓦插件白名单。

其次,您可能需要将withCredentials添加到$http(因此$resource)查询中:

  .config(function($httpProvider) {
        $httpProvider.defaults.withCredentials = true;
    });
 类似资料:
  • 我正在尝试使用我的ReactJs应用程序在Docker中运行(不使用express)来发出post/put/patch/delete请求,但我的请求被CORS阻止了。我的后端是一个Spring Boot服务,也运行在Docker中。 错误: 当我尝试直接打开它(通过URL)时,不会被识别。路由到它(通过NavBar)工作良好。 编辑:也许我的Spring配置错了?我使用的是这个全局示例,它可以很好

  • 我需要在React中使用CORS节点模块,React是使用实用程序创建的。 由于它是一个实用程序,我不能调整内部并将CORS注入预配置的EXPRESS模块。 我们如何才能做到这一点?

  • 我正在构建一个供iOS/Android应用程序使用的API。该应用程序使用JSON Web Token来验证用户。我在尝试从本机应用程序与API对话时遇到了CORS问题。所以我为所有来源添加了CORS头(只在以< code>/api/开头的URL上)。它现在工作正常,但我想知道我所做的是否不是一个潜在的漏洞? 我应该允许所有的起源吗?如果API要被原生应用请求,我有办法提前知道原生主机吗? 我挺迷

  • 问题内容: 我有一个Ionic应用程序,我想将节点模块angular-base64包含在我的控制器中,甚至包装在angular服务中,等等。 哪个安装了包含文件的文件夹。因此,文件的完整路径为。 但是,当我尝试像这样在我的一个控制器中使用该模块时: 我不知道我在说什么。我是否需要做其他事情才能使它起作用?也许我的东西? 问题答案: 接受的答案对于 Ionic V2 不再正确,并且已从默认安装中删除

  • 我试图在我的Ionic Angular应用程序中执行以下函数,cloudFunctionUrl是我在firebase项目中的一个云函数: 为了解决CORS问题,我安装了允许CORS:Access-Control-Allow-Origin chrome插件。以下是白名单域的列表: null 我遇到了两个问题: null 有人能告诉我怎么解决这件事吗? 我也尝试将下面的头添加到请求中,但错误仍在出现:

  • 我有一个React应用程序,位于http://localhost:3000/,而Laravel API位于http://localhost/blog/public/API/ 我得到以下错误 CORS策略阻止了在“http://localhost/blog/public/api/auth/signin”从origin“http://localhost:3000”获取的访问:请求的资源上没有“acce