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

Express Gateway JWT令牌颁发异常:仍返回不透明令牌求助

解决Express Gateway返回不透明令牌而非JWT的问题

作为EG新手碰到这个问题很常见,我帮你梳理下几个关键排查点和修复步骤:

1. 先检查system.config.yml的格式正确性

你提供的system.config看起来缩进有问题,YAML对缩进要求非常严格,如果格式错误,EG会忽略掉tokenType: 'jwt'这类配置,导致还是生成默认的不透明令牌。正确的层级缩进格式应该是这样:

db:
  redis:
    host: localhost
    port: 6379
    namespace: EG
crypto:
  cipherKey: sensitiveKey
  algorithm: aes256
  saltRounds: 10
session:
  secret: keyboard cat
  resave: false
  saveUninitialized: false
accessTokens:
  timeToExpiry: 7200000
  tokenType: 'jwt'  # 这个配置必须在accessTokens层级下,缩进要正确
  issuer: 'express-gateway'
  audience: 'something'
  subject: 'test'
  secretOrPrivateKey: 'ssssst'
refreshTokens:
  timeToExpiry: 7200000
authorizationCodes:
  timeToExpiry: 300000

你可以用YAML校验工具确认格式合法性,避免因缩进错误导致配置不生效。

2. 确认应用凭证的类型匹配

你提到添加了JWT凭证,但需要确保应用关联的凭证类型确实是jwt,而不是其他类型(比如oauth2)。可以通过EG的CLI命令查看:

eg credentials list --client-id ae921ba9-7b4b-4c53-aaba-354bd6398e52

如果输出的凭证类型不是jwt,需要重新创建JWT类型的凭证并关联到应用:

eg credentials create --type jwt --client-id ae921ba9-7b4b-4c53-aaba-354bd6398e52 --secret ssssst

3. 在OAuth2策略中明确指定tokenType

有时候全局的accessTokens配置可能不会被OAuth2策略继承,你可以在gateway.config.yml的oauth2策略里显式添加tokenType: 'jwt',强制生成JWT令牌:

pipelines:
  default:
    apiEndpoints:
      - api
    policies:
      - oauth2:
          action:
            jwt:
              issuer: express-gateway
              audience: something
              subject: test
              secretOrPublicKey: ssssst
              checkCredentialExistence: false
            tokenType: 'jwt'  # 新增这一行,明确指定令牌类型
      - proxy:
          - action:
              serviceEndpoint: httpbin
              changeOrigin: true

4. 尝试切换授权流程测试

你当前用的是隐式授权(response_type=token),有些场景下EG对隐式授权的JWT支持需要额外配置。可以先试试用授权码流程测试:

  1. 先请求授权码:
http://localhost:8080/oauth2/authorize?response_type=code&client_id=ae921ba9-7b4b-4c53-aaba-354bd6398e52&redirect_uri=http://localhost:3002/explorer&client_secret=0qOpBZkwO2ayQ8dO18yRuh
  1. 拿到code后,用POST请求换令牌:
curl -X POST http://localhost:8080/oauth2/token \
  -d "grant_type=authorization_code" \
  -d "code=YOUR_AUTH_CODE" \
  -d "redirect_uri=http://localhost:3002/explorer" \
  -u "ae921ba9-7b4b-4c53-aaba-354bd6398e52:0qOpBZkwO2ayQ8dO18yRuh"

如果这个流程能返回JWT,说明你的基础配置是对的,只是隐式授权的配置需要调整。

5. 查看EG启动日志排查错误

启动EG时加上--verbose参数,查看详细日志,确认配置是否被正确加载:

eg gateway start --verbose

日志里如果出现关于accessTokens.tokenType的加载信息,说明配置生效;如果没有,可能是配置文件路径错误或者格式问题。

最后验证

修改配置后重启EG,再次请求令牌,应该就能拿到格式类似eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...的JWT令牌了。

内容的提问来源于stack exchange,提问作者Cesar Sosa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:34:20