繁体   English   中英

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

[英]Not able to request WSO2 API (with CORS activated) via AngularJS

当我的客户端AngularJS应用尝试通过WSO2 API管理器(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开发者工具中检查标题时,可以确认对“ OPTIONS”请求的响应中没有“ Access-Control-Allow-Origin”标题。

header_chrome

当我在Chrome Advanced REST Client中使用相同的HTTP方法(GET / ReferentielInfoConso / offres-tarifaires / identifiants HTTP / 1.1)请求相同的URL时,可以看到预期的标头“ Access-Control-Allow-Origin”,并且可以访问到资源:

capture_rest_client

那么我应该怎么做才能使其在我的AngularJS应用程序中运行(不创建Node.js后端,我需要保持它的轻量化)? 为什么在WSO2中启用CORS还不够?

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

编辑2:当我的AngularJS应用试图在不发送授权令牌的情况下到达WSO2 API时,我收到401响应,其中包含预期的“ Access-Control-Allow-Origin”标头。 一旦添加令牌,看起来它通过WSO2 AM遵循了一条不同的路线,而我没有得到“ Access-Control-Allow-Origin”标头。

编辑3:如果我有一个“自动化”标头,并尝试直接到达我的Tomcat 7后端,我也会遇到一个“跨域”问题,但是我想这是因为“授权”标头不在Tomcat允许的标头列表中CONF。 不过,它在WSO2 AM允许的标头列表中(我添加了“授权”和“授权”以确保它可以正常工作)。

因此,这是最终的答案: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管理器发行版的文件夹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">*

现在默认端点也可以与cors调用一起使用。

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

另请注意,您可以从发布商界面按API定义CORS配置。 如果已进行配置,则该特定API将忽略api-manager.xml中给出的CORS配置。

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

对于我的特殊情况,我想让客户端应用程序请求令牌并在AJAX中调用API,我选择了最简单的解决方案:使用以下这些简单的conf行在与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/"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM