WSO2 API Manager 3.0.0 Token API与Angular应用的CORS问题求助
针对你在跨虚拟机环境下调用Token API时遇到的CORS报错,结合你的现有配置,我整理了几个关键的排查和解决步骤:
1. 为Token API添加OPTIONS预检请求处理
浏览器发起跨域请求前会先发OPTIONS预检请求,但你的TokenAPI.xml里只定义了POST方法的资源逻辑,没有处理OPTIONS请求。需要在现有POST资源上方添加这段配置:
<resource methods="OPTIONS" url-mapping="/*"> <inSequence> <property name="Access-Control-Allow-Origin" expression="$http:Origin" scope="transport"/> <property name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,PATCH,OPTIONS" scope="transport"/> <property name="Access-Control-Allow-Headers" value="authorization,Content-Type,SOAPAction" scope="transport"/> <property name="Access-Control-Allow-Credentials" value="true" scope="transport"/> <respond/> </inSequence> </resource>
这段配置会直接返回符合要求的CORS响应头,不需要将OPTIONS请求转发到后端OAuth2端点。
2. 确认CORS Handler的优先级和配置细节
你已经添加了CORSRequestHandler,但要确保它是第一个执行的Handler(放在所有其他Handler之前),这样能优先处理CORS相关逻辑。另外检查allowHeaders是否覆盖了Angular实际发送的所有请求头——如果你的请求里有自定义头,需要补充到该属性值中。
3. 确保配置修改生效
修改TokenAPI.xml和RevokeAPI.xml后,必须重启WSO2 APIM服务,Synapse配置的变更需要重启才能加载生效。同时确认文件路径正确:/usr/lib64/wso2/wso2am/3.0.0/repository/deployment/server/synapse-configs/default/api,且文件名是TokenAPI.xml和RevokeAPI.xml(已去掉下划线)。
4. 排查全局CORS配置冲突
检查api-manager.xml中的全局CORS配置是否可能覆盖API级别的设置:
- 打开
<APIM_HOME>/repository/conf/api-manager.xml - 找到
<CORSConfiguration>节点,确保enable设为true;如果全局配置限制了Origin,需要调整为*或者你的Angular应用的具体域名。
5. 验证响应头是否正确返回
用浏览器开发者工具的Network标签查看OPTIONS请求的响应,确认是否包含以下关键头:
Access-Control-Allow-Origin:值为你的Angular应用域名或*Access-Control-Allow-Methods:包含POST和OPTIONSAccess-Control-Allow-Headers:匹配你请求中使用的所有头Access-Control-Allow-Credentials:true(如果你的请求携带了凭证)
如果这些头没有正确返回,说明配置未生效,需要重新核对上述步骤。
内容的提问来源于stack exchange,提问作者k10gaurav

