首页 文章

无法通过AngularJS请求WSO2 API(已激活CORS)

提问于
浏览
1

当我的客户端AngularJS应用程序试图通过WSO2 API Manager(v2.0.0)暴露某些REST API时,我收到此响应(IP,端口替换为“am_host”和“am_port”):

Refused to set unsafe header "Origin"
XMLHttpRequest cannot load http://am_host:am_port/ReferentielInfoConso/offres-tarifaires/identifiants. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8000' is therefore not allowed access.

当我检查Chrome开发工具中的 Headers 时,我可以确认“OPTIONS”请求的响应中没有“Access-Control-Allow-Origin” Headers .

header_chrome

当我在Chrome高级REST客户端中使用相同的HTTP方法(GET / ReferentielInfoConso / offres-tarifaires / identifiants HTTP / 1.1)请求相同的URL时,我可以看到预期的 Headers “Access-Control-Allow-Origin”,我可以访问对资源:

capture_rest_client

那么我应该怎么做才能使它在我的AngularJS App中工作(没有创建Node.js后端,我需要保持它很轻)?为什么在WSO2中启用CORS是不够的?

编辑:如果我的AngularJS应用程序直接向Tomcat 7 endpoints 请求API(默认情况下启用CORS)而不通过WSO2 AM,它可以正常工作 .

编辑2:当我的AngularJS应用程序尝试在不发送授权令牌的情况下到达WSO2 API时,我得到401响应,包括预期的“Access-Control-Allow-Origin”标头 . 一旦我添加令牌,它看起来像是通过WSO2 AM的不同路由,我没有得到“Access-Control-Allow-Origin”标头 .

编辑3:如果我有一个“Autorization” Headers 并尝试直接到达我的Tomcat 7后端,我也会遇到“跨域”问题,但我想这是因为“授权” Headers 不在Tomcat允许的 Headers 列表中CONF . 它位于WSO2 AM允许的 Headers 列表中(我已经添加了“授权”和“授权”以确保它可以工作) .

4 回答

  • 1

    所以这是最终答案:WSO2中存在多个错误,这些错误使得CORS无法直接从Web应用程序(无后端)与API交互变得容易 .

    首先,由于没有记录的原因,/ token API不受repository / conf / api-manager.xml中的全局api conf的影响,因此您需要深入conf(repository / deployment / server / synapse-) configs / default / api / TokenAPI.xml)并添加CORSRequestHandler conf从同一目录中的任何其他xml文件复制它 .

    其次,当您使用默认版本URL(当1.0版本被标记为默认版本时,http://host:port/Context/myapi而不是http://host:port/Context/1.0/myapi)时,您将不会收到CORS标头:https://wso2.org/jira/browse/APIMANAGER-5361

    因此,在TokenAPI.xml中手动配置CORShandler并用显式版本调用替换我的调用后,我可以删除我的反向代理 . 我仍然期望更正默认版本错误,因为默认版本是一个有用的功能 .

  • 0

    我通过修改WSO2 API Manager分发文件夹repository \ resources \ api_templates中包含的文件 default_api_template.xml 来解决了这个问题 .

    我只是修改了这条线

    <resource methods="POST PATCH GET DELETE HEAD PUT">
    

    通过以这种方式添加OPTIONS动词:

    <resource methods="POST PATCH GET DELETE HEAD PUT OPTIONS">*
    

    现在,默认 endpoints 也可以使用cors调用 .

  • 1

    如果您没有在API Publisher UI的资源列表中定义OPTIONS方法,则APIM应发送所有CORS标头,如api-manager.xml中所指定 .

    另请注意,您可以从发布者UI定义每个API的CORS配置 . 如果已配置,则该特定API将忽略api-manager.xml中给出的CORS配置 .

    如果您的后端启用了CORS,您也可以向后端发送OPTIONS请求 . 为此,您可以在API Publisher中为 /* OPTIONS 创建资源 .

  • 0

    对于我的特殊情况,我希望客户端应用程序请求令牌并在AJAX中调用API,我选择了最简单的解决方案:使用下面这些简单的配置行在与WSO2相同的机器上配置Apache Web服务器 .

    Header set Access-Control-Allow-Origin "*"
        Header set Access-Control-Allow-Methods "GET,PUT,POST,DELETE,PATCH,OPTIONS"
        Header set Access-Control-Allow-Headers "authorization,Access-Control-Allow-Origin,Content-Type,SOAPAction,Authorization"
    
        ProxyPass "/" "http://10.22.106.101:8280/"
        ProxyPassReverse "/" "http://10.22.106.101:8280/"
    

相关问题