当我的客户端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 .
当我在Chrome高级REST客户端中使用相同的HTTP方法(GET / ReferentielInfoConso / offres-tarifaires / identifiants HTTP / 1.1)请求相同的URL时,我可以看到预期的 Headers “Access-Control-Allow-Origin”,我可以访问对资源:
那么我应该怎么做才能使它在我的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 回答
所以这是最终答案: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并用显式版本调用替换我的调用后,我可以删除我的反向代理 . 我仍然期望更正默认版本错误,因为默认版本是一个有用的功能 .
我通过修改WSO2 API Manager分发文件夹repository \ resources \ api_templates中包含的文件 default_api_template.xml 来解决了这个问题 .
我只是修改了这条线
通过以这种方式添加OPTIONS动词:
现在,默认 endpoints 也可以使用cors调用 .
如果您没有在API Publisher UI的资源列表中定义OPTIONS方法,则APIM应发送所有CORS标头,如api-manager.xml中所指定 .
另请注意,您可以从发布者UI定义每个API的CORS配置 . 如果已配置,则该特定API将忽略api-manager.xml中给出的CORS配置 .
如果您的后端启用了CORS,您也可以向后端发送OPTIONS请求 . 为此,您可以在API Publisher中为
/* OPTIONS
创建资源 .对于我的特殊情况,我希望客户端应用程序请求令牌并在AJAX中调用API,我选择了最简单的解决方案:使用下面这些简单的配置行在与WSO2相同的机器上配置Apache Web服务器 .