gpt4 book ai didi

php - CakePHP2 : CORS Preflight issues with JWT Auth

转载 作者:可可西里 更新时间:2023-10-31 23:37:13 28 4
gpt4 key购买 nike

我正在构建一个与 CakePHP 2.8 中实现的 REST API 对话的 Ionic 1 应用程序,使用 JSON Web Tokens (JWT)用于授权。

在未经授权的状态下,我的应用能够毫无问题地向服务器发出 GET/POST 请求。但是,一旦我通过身份验证并且我的应用随每个请求一起发送一个 authToken header ,Angular 会首先自动发送一个 OPTIONS 预检请求。

这就是问题的开始。由于自动预检请求没有设置 authToken header ,并且因为 API 端点需要授权,CakePHP 以 302 FOUND 重定向响应到 /login。应用程序(或浏览器,在这个测试阶段)认为这是不安全的,并且永远不会继续发出正确的请求。

我的问题:我怎样才能让 CakePHP 适本地响应预检 OPTIONS 请求,以便 AngularJS 知道它可以安全地将自定义 header 发送到跨域服务器?

根据 this question ,这是需要发生的事情:

请求 header :

Origin: http://yourdomain.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-Custom-Header

响应头:

Access-Control-Allow-Origin: http://yourdomain.com // Same as origin above
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: X-Custom-Header

我尝试过的事情:

-设置 .htaccess 以始终使用 200 响应 OPTIONS 请求。我收到 200 响应,但响应显示“您的服务器配置错误”,并且由于没有设置正确的 header ,真正的 $http 请求永远不会通过。

-让 CakePHP 始终以某种方式响应 OPTIONS 请求。这里的问题是让 Cake 跳过授权,跳过尝试运行 Controller 操作,并发回带有正确 header 集的 HTTP 200 响应。

    // AppController::beforeFilter();
if($this->request->is("options")){
// Send the appropriate response based on the request
}

出于好奇,以下是在失败的 $http 请求过程中交换的 header :

GENERAL:
Request URL:https://api.example.com/rest_users/profile.json
Request Method:OPTIONS
Status Code:302 Found
Remote Address:x.x.x.x:443

REQUEST HEADERS:
Accept:*/*
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:en-US
Access-Control-Request-Headers:authtoken
Access-Control-Request-Method:GET
Cache-Control:no-cache
Connection:keep-alive
DNT:1
Host:api.example.com
Origin:http://x.x.x.x:8100
Pragma:no-cache
Referer:http://x.x.x.x:8100/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36


RESPONSE HEADERS:
Access-Control-Allow-Headers:Content-Type, x-xsrf-token
Access-Control-Allow-Methods:*
Access-Control-Allow-Origin:*
Access-Control-Max-Age:172800
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:20
Content-Type:text/html; charset=UTF-8
Date:Thu, 29 Dec 2016 18:51:30 GMT
Keep-Alive:timeout=15, max=99
Location:https://api.example.com/login
Server:Apache/2.2.15 (CentOS)
Vary:Accept-Encoding
X-Powered-By:PHP/5.3.3

最佳答案

我找到了一个允许 CakePHP 正确处理 CORS 预检的解决方案。它设置 header ,发送响应,并在请求的操作运行之前关闭 Cake。

确保在所有 Controller 中都有 parent::beforeFilter(); 以便此代码运行。

在 AppController::beforeFilter() 中:

    if($this->request->is("options")){
// Set the headers
$this->response->header('Access-Control-Allow-Origin','*');
$this->response->header('Access-Control-Allow-Methods','*');
$this->response->header('Access-Control-Allow-Headers','Content-Type, Authorization');
// Send the response
$this->response->send();
// Don't do anything else!
$this->_stop();
}

关于php - CakePHP2 : CORS Preflight issues with JWT Auth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41385898/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com