SAP CAPM服务调用S/4HANA On-Prem SOAP服务遇407代理认证过期问题
问题描述
- 在SAP CAP服务中,使用sap-cloud-sdk/http-client和sap-cloud-sdk/connectivity版本3.25.0,通过BTP目标与云连接器调用S/4HANA On-Prem的SOAP Web服务
- 部署到Cloud Foundry后当日运行正常,次日执行时触发HTTP 407「代理认证失败」错误
- 重启/重新部署CAP应用后恢复正常,日志显示核心异常点:
- 代理认证用的Bearer令牌签发时间为1736950306(2025-01-15 15:11:46),过期时间为1736993506(2025-01-16 03:11:46)
- 2025-01-17T16:55:25.116+0000的请求仍携带该过期令牌发起认证
- 即使通过Job Scheduler执行或Postman生成新令牌,缓存的过期令牌依然被持续使用
根因分析
SAP Cloud SDK 3.25.0版本的connectivity模块存在令牌缓存逻辑缺陷:代理认证所需的Bearer令牌被全局缓存后,未实现过期自动刷新机制,也未监听令牌过期事件,导致应用持续复用过期令牌,直到应用重启才会重新获取有效令牌。
解决方案
1. 升级SAP Cloud SDK版本(推荐生产环境使用)
SAP官方在3.30.0及后续版本中修复了该令牌缓存失效问题,直接升级依赖即可解决:
在package.json中更新依赖版本:
{ "dependencies": { "@sap-cloud-sdk/http-client": "^3.30.0", "@sap-cloud-sdk/connectivity": "^3.30.0" } }
执行依赖更新并重新部署:
npm install cf push
2. 临时禁用令牌缓存(应急方案)
如果暂时无法升级版本,可通过自定义配置强制每次请求重新获取令牌:
import { createHttpClient, DestinationFetchOptions } from '@sap-cloud-sdk/http-client'; import { getDestination } from '@sap-cloud-sdk/connectivity'; async function invokeOnPremSoapService() { // 获取目标时禁用缓存 const destination = await getDestination('YOUR_ON_PREMISE_DESTINATION', { useCache: false } as DestinationFetchOptions); const httpClient = createHttpClient(destination); // 此处添加SOAP请求调用逻辑 }
注意:该方案会增加令牌获取请求次数,可能影响性能,仅作为临时应急使用。
3. 配置定时重启(临时缓解)
在Cloud Foundry中设置应用每日定时重启,确保在令牌过期前刷新应用:
通过CF CLI设置每日凌晨2点重启(早于令牌过期时间):
cf schedule-restart your-cap-app "0 2 * * *"
也可在manifest.yml中配置健康检查确保应用异常时自动重启:
applications: - name: your-cap-app health-check-type: http health-check-http-endpoint: /health restart: always
内容的提问来源于stack exchange,提问作者Athul Ram
相关产品推荐
相关产品推荐

