从Power Virtual Agent BOT调用S/4 HANA OData PATCH请求时CSRF验证失败
问题:Teams中PVA Bot通过Azure网关调用S/4 HANA OData v2 PATCH请求失败(CSRF验证错误)
场景描述
部署在MS Teams的Power Virtual Agent Bot,通过Azure HTTP网关向S/4 HANA发起OData v2的PATCH请求时返回403错误,但同一用户在Postman和SAP Gateway Client中测试该服务完全正常。
当前BOT侧配置步骤
- 步骤1:发起GET请求获取CSRF Token,请求头配置:
注:Cookie值已转码,将Authorization: Bearer(tokenvalue) X-CSRF-Token : Fetch Set-Cookie : Fetch/替换为%2F、空格替换为%2b、逗号替换为; - 步骤2:获取CSRF Token后存入本地变量,发起PATCH请求,请求头配置:
Authorization : Bearer(tokenvalue) X-CSRF-Token : [获取到的token值] Cookie : [转码后的Cookie值]
错误信息(Power Automate Flow中观测)
"error": { "code": 403, "message": "The response is not in a JSON format.", "innerError": "CSRF token validation failed" } }
排查与解决方案
1. 修正Cookie转码逻辑
当前的Cookie转码规则存在错误:
- 空格的URL编码应为
%20而非%2b(%2b是+的编码) - 逗号属于Cookie的合法字符,不需要替换为
;(;是Cookie的分隔符,替换后会破坏Cookie结构)
建议直接复用GET请求返回的原始Cookie值,仅对必要的特殊字符(如/)进行转码,确保Cookie结构与Postman中一致。
2. 确认CSRF Token的完整传递
- 检查GET请求的响应头,确保正确提取到
x-csrf-token的完整值(无截断、无额外空格) - PATCH请求的
X-CSRF-Token头必须完整填入该值,不能留空或仅部分填写
3. 对齐请求头与Postman的一致性
- 新增
Content-Type: application/json请求头(OData v2的PATCH请求需要明确指定内容类型,否则可能触发格式错误提示) - 对比Postman的所有请求头,确保Power Automate中没有遗漏其他必要头部(如
Accept、DataServiceVersion等)
4. 验证Azure网关的转发规则
- 检查Azure HTTP网关是否允许传递
Cookie、X-CSRF-Token等自定义头部,避免网关过滤导致这些信息丢失 - 确认网关未对请求体或头部进行额外的编码/修改,保持请求原始格式
5. 检查请求体格式
虽然错误提示指向CSRF,但附带的JSON格式错误可能是诱因:
- 确保PATCH请求体符合OData v2规范,比如包含正确的
@odata.type注解(如果需要) - 对比Postman中的请求体结构,排除JSON语法错误或字段缺失问题
内容的提问来源于stack exchange,提问作者Pavan Kandalam
相关产品推荐
相关产品推荐

