You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Karate框架调用GraphQL接口时Bearer授权不生效问题

GraphQL接口Karate调用Bearer认证失败排查

问题现象

对GraphQL服务做Bearer认证调试时,携带相同认证凭证的请求在Postman中可正常调用,在Karate测试框架中执行却认证失败。
使用的Karate测试脚本如下:

Scenario: Check authorisation
  Given text query =
  """
  config { name value }
  """
  And request { query: '#(query)' }
  And header 'Authorization' = 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9'
  And cookie foo = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9'
  When method Post
  Then status 200
  Then print error

对应执行日志:

16:28:03.390 [main] INFO  com.intuit.karate - [print] Authorization Cookie:  eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaWctcWE1LXRydC1lcGF4LmJzZ2cuY28udWsiLCJzdWIiOiI1MjY1YmNiNS03NDlmLTQyMGMtOTczOC1kYTA5ZDA0MWU5ZGYiLCJlcGF4RGF0YSI6eyJyb2xlIjoiUEFYIiwic2VjdG9yIjoiN2NlYWViZmItNTIwYS00ODVkLTgzOTItOWFjOGI4ZDQ5NTNiIn0sImlhdCI6MTY1Njg0NTg4MywiZXhwIjoxNjU2OTMyMjgzfQ.3xinKBMKvFRaLH4kRqBLSALAm6K-QqFF9jD5nTlxa3I 
16:28:03.418 [main] DEBUG com.intuit.karate - request:
2 > POST https://baseUrl/air-server/graphql
2 > Content-Type: application/json; charset=UTF-8
2 > Accept: */*
2 > Connection: keep-alive
2 > 'Authorization': Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaWctcWE1LXRydC1lcGF4LmJzZ2cuY28udWsiLCJzdWIiOiI1MjY1YmNiNS03NDlmLTQyMGMtOTczOC1kYTA5ZDA0MWU5ZGYiLCJlcGF4RGF0YSI6eyJyb2xlIjoiUEFYIiwic2VjdG9yIjoiN2NlYWViZmItNTIwYS00ODVkLTgzOTItOWFjOGI4ZDQ5NTNiIn0sImlhdCI6MTY1Njg0NTg0MywiZXhwIjoxNjU2OTMyMjgzfQ.3xinKBMKvFRaLH4kRqBLSALAm6K-QqFF9jD5nTlxa3I
2 > 'Cookie': epax_jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaWctcWE1LXRydC1lcGF4LmJzZ2cuY28udWsiLCJzdWIiOiI1MjY1YmNiNS03NDlmLTQyMGMtOTczOC1kYTA5ZDA0MWU5ZGYiLCJlcGF4RGF0YSI6eyJyb2xlIjoiUEFYIiwic2VjdG9yIjoiN2NlYWViZmItNTIwYS00ODVkLTgzOTItOWFjOGI4ZDQ5NTNiIn0sImlhdCI6MTY1Njg0NTg0MywiZXhwIjoxNjU2OTMyMjgzfQ.3xinKBMKvFRaLH4kRqBLSALAm6K-QqFF9jD5nTlxa3I
2 > Cookie: epax_jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaWctcWE1LXRydC1lcGF4LmJzZ2cuY28udWsiLCJzdWIiOiI1MjY1YmNiNS03NDlmLTQyMGMtOTczOC1kYTA5ZDA0MWU5ZGYiLCJlcGF4RGF0YSI6eyJyb2xlIjoiUEFYIiwic2VjdG9yIjoiN2NlYWViZmItNTIwYS00ODVkLTgzOTItOWFjOGI4ZDQ5NTNiIn0sImlhdCI6MTY1Njg0NTg0MywiZXhwIjoxNjU2OTMyMjgzfQ.3xinKBMKvFRaLH4kRqBLSALAm6K-QqFF9jD5nTlxa3I
2 > Content-Length: 33
2 > Host: baseUrl
2 > User-Agent: Apache-HttpClient/4.5.13 (Java/15.0.2)
2 > Accept-Encoding: gzip,deflate
{"query":"config { name value }"}

16:28:04.064 [main] DEBUG com.intuit.karate - response time in milliseconds: 645
2 < 400
2 < Date: Sun, 03 Jul 2022 10:58:03 GMT
2 < Content-Type: application/json
2 < Transfer-Encoding: chunked
2 < Connection: keep-alive
2 < X-Powered-By: Express
2 < Access-Control-Allow-Origin: *
{"errors":[{"message":"Context creation failed: Unauthorized","extensions":{"code":"UNAUTHENTICATED"}}]}


16:28:04.065 [main] ERROR com.intuit.karate - src/test/java/gss/users/users.feature:27
Then status 200
status code was: 400, expected: 200, response time in milliseconds: 645, url: https://baseUrl/air-server/graphql, response: 
{"errors":[{"message":"Context creation failed: Unauthorized","extensions":{"code":"UNAUTHENTICATED"}}]}

从日志表面看请求已经携带了Authorization头和对应Cookie,但接口返回400状态码,提示上下文创建失败、未认证,状态码200的断言失败。

根因定位

从日志和脚本对比可以定位到3个核心问题:

  • Cookie配置错误且重复发送:脚本里写的是cookie foo = 'xxx',但服务端实际识别的认证Cookie名是epax_jwt,同时因为Karate默认开启自动Cookie管理,全局自动携带的Cookie加上手动配置的Cookie,最终请求发出了两个重复的epax_jwt Cookie头。基于Express的服务端解析重复Cookie头时,会拿到数组类型的Cookie值,JWT验签直接失败。
  • Authorization头配置冲突:脚本里硬编码的Authorization头携带的JWT只有第一段(JWT标准结构是三段用.分隔),属于无效token,日志里显示的完整token来自全局配置的头规则,重复配置头容易出现值覆盖、多值拼接的问题,部分服务端遇到多值Authorization头会直接判定无效。
  • 请求特征和Postman不一致:Karate默认发送的User-Agent是Apache-HttpClient标识,和Postman的默认UA不一致,如果服务端配置了UA拦截、反爬规则,会直接拦截请求。

修复方案

  • 统一认证信息配置入口:不要在全局和单场景里重复设置Authorization头,单场景里移除硬编码的截断token,统一使用完整的、三段结构的JWT,确保Bearer和token之间只有一个英文空格,无多余不可见字符。
  • 修正Cookie配置:将脚本里的cookie foo = 'xxx'改为cookie epax_jwt = '你的完整JWT值',同时在Karate配置里加* configure cookies = null关闭自动Cookie管理,避免重复发送Cookie头,保证请求里只有一个合法的Cookie头。
  • 对齐Postman请求特征:打开Postman控制台导出实际发送的请求头列表,和Karate日志逐行对比,把Karate的User-Agent、Origin等头的值设置成和Postman完全一致,排除服务端侧的请求特征拦截。
  • 校验修复结果:修改后重新执行用例,确认日志里只有一个Authorization头、一个Cookie头,无重复头字段,即可正常通过认证。

内容的提问来源于stack exchange,提问作者New Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 05:27:46