无法将eZ平台JS REST API客户端用于跨域 语境与困境

无法将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

我目前正在ezPlatform&Symfony之上构建一个web应用程序

我现在的目标是使用JS客户端(使用ezplatform的JS REST客户端:CAPI.JS)从外部网站请求此应用程序

我在本地测试了我的脚本(在应用程序本身=相同的域上),一切都很好:我可以获取和发布数据

但是在外部webiste(CORS请求)上测试这个脚本是行不通的。我遇到了两个不同的问题:

  • 服务器端:响应头不包含允许的访问控制方法
  • 客户端:请求中未提供会话cookie
  • 细节 问题1:没有标题“允许方法” 在chrome上,我总是有以下错误:

    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,这样看起来就可以了

    结论 我真的很想知道ez平台rest客户端是否被设计用于跨域,但如果不是,那将非常令人惊讶

    所以我必须做些错事,如果有人能解释我所做的,我将万分感激:)