无法将eZ平台JS REST API客户端用于跨域 语境与困境
我目前正在ezPlatform&Symfony之上构建一个web应用程序 我现在的目标是使用JS客户端(使用ezplatform的JS REST客户端:CAPI.JS)从外部网站请求此应用程序 我在本地测试了我的脚本(在应用程序本身=相同的域上),一切都很好:我可以获取和发布数据 但是在外部webiste(CORS请求)上测试这个脚本是行不通的。我遇到了两个不同的问题:无法将eZ平台JS REST API客户端用于跨域 语境与困境,rest,cors,apache2.4,preflight,ezplatform,Rest,Cors,Apache2.4,Preflight,Ezplatform,我目前正在ezPlatform&Symfony之上构建一个web应用程序 我现在的目标是使用JS客户端(使用ezplatform的JS REST客户端:CAPI.JS)从外部网站请求此应用程序 我在本地测试了我的脚本(在应用程序本身=相同的域上),一切都很好:我可以获取和发布数据 但是在外部webiste(CORS请求)上测试这个脚本是行不通的。我遇到了两个不同的问题: 服务器端:响应头不包含允许的访问控制方法 客户端:请求中未提供会话cookie 细节 问题1:没有标题“允许方法” 在chro
XMLHttpRequest cannot load http://api.ezplatform.lan/api/ezp/v2/user/sessions. Response for preflight has invalid HTTP status code 405
注意,在服务器端,nelmio_cors捆绑包用于配置头。配置:
nelmio_cors:
paths:
'^/api/ezp/v2/':
max_age: 3600
allow_credentials: true
allow_origin: ['*']
allow_methods: ['POST', 'PUT', 'GET', 'DELETE', 'OPTIONS']
expose_headers: []
现在,以下是飞行前请求失败的详细信息:
GENERAL
Request URL:http://api.ezplatform.lan/api/ezp/v2/user/sessions
Request Method:OPTIONS
Status Code:405 Method Not Allowed
Remote Address:192.168.1.82:80
REPONSE HEADERS
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:authorization, accept, content-type, x-csrf-token, destination, x-siteaccess
Access-Control-Allow-Origin:http://www.externalsite.lan
Access-Control-Max-Age:3600
Cache-Control:private
Connection:Keep-Alive
Content-Length:0
Content-Type:text/html; charset=UTF-8
Date:Tue, 13 Dec 2016 15:24:44 GMT
Keep-Alive:timeout=5, max=99
Server:Apache/2.4.23 (Ubuntu)
Vary:X-User-Hash
REQUEST HEADERS
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Access-Control-Request-Headers:content-type
Access-Control-Request-Method:POST
Cache-Control:no-cache
Connection:keep-alive
Host:api.ezplatform.lan
Origin:http://www.externalsite.lan
Pragma:no-cache
Referer:http://www.externalsite.lan/
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
在“响应头”中,没有访问控制允许方法
,尽管配置了nelmio_cors
在nelmio_cors代码中挖掘时,我意识到“allow_methods”配置已被检索,但随后被其他内容覆盖,在这里,它变得模糊起来
也许给我一个关于这种情况的线索:ezPublishRestBundle似乎找不到任何“允许的方法”,并以某种方式覆盖了nelmio_cors配置
在Resprovider.php文件中,如果我强制方法返回以下内容:
return[“POST”、“PUT”、“GET”、“DELETE”、“OPTIONS”]代码>那么我没有更多的405错误
,而是一个非常不同的问题(在此之后解释)
问题2:不允许会话cookie
通过我以前的精彩破解,我现在可以走得更远一点:我的请求被允许了,但其中一些仍然失败
我注意到请求中没有传递会话cookie(这是在同一域上进行的正常行为测试)
这一次,它似乎来自CAPI.js文件:XmlHttpRequest
对象的withCredentials
属性从来都不是true
如果我添加此代码XHR.withCredentials=true在发送请求之前,在CAPI.js中使用code>,这样看起来就可以了
结论
我真的很想知道ez平台rest客户端是否被设计用于跨域,但如果不是,那将非常令人惊讶
所以我必须做些错事,如果有人能解释我所做的,我将万分感激:)