CakePHP2:与JWT Auth的CORS预检问题
我正在构建一个Ionic 1应用程序,它与Cake
PHP 2.8中实现的REST API进行通信,使用
JSON Web Tokens (JWT)进行身份验证.
在未经授权的状态下,我的应用程序能够毫无问题地向服务器发出GET / POST请求.但是,一旦我进行了身份验证并且我的应用程序正在发送authToken标头以及每个请求,Angular会首先自动发送OPTIONS预检请求. 这是问题开始的地方.由于自动预检请求没有设置authToken标头,并且因为API端点需要授权,所以CakePHP会使用302 FOUND重定向到/ login进行响应.应用程序(或浏览器,在此测试阶段)认为这是不安全的,并且永远不会继续提出正确的请求. 我的问题:如何让CakePHP对预检OPTIONS请求作出适当的响应,以便AngularJS知道它可以安全地将自定义标头发送到跨域服务器? 根据this question,这是需要发生的事情: 请求标头: 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响应,但响应说“你的服务器配置错误”,并且因为它没有设置正确的标头,真正的$http请求永远不会通过. – 获取CakePHP始终以特定方式响应OPTIONS请求.这里的问题是让Cake跳过授权,跳过尝试运行控制器操作,并使用正确的标头集发回HTTP 200响应. // AppController::beforeFilter(); if($this->request->is("options")){ // Send the appropriate response based on the request } 对于好奇,这里是在失败的$http请求过程中交换的标题: 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预检的解决方案.它设置标头,发送响应,并在请求的操作可以运行之前关闭Cake.
一定要有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(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |