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支持需要额外配置。可以先试试用授权码流程测试:
- 先请求授权码:
http://localhost:8080/oauth2/authorize?response_type=code&client_id=ae921ba9-7b4b-4c53-aaba-354bd6398e52&redirect_uri=http://localhost:3002/explorer&client_secret=0qOpBZkwO2ayQ8dO18yRuh
- 拿到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

