如何在多个Flask应用之间共享JWT Access Token
解决方案
首先明确报错原因:Missing claim: identity 说明服务在JWT的payload中找不到名为identity的身份声明字段,该问题在跨应用使用flask-jwt-extended时,90%以上是由版本差异或JWT配置未完全对齐导致的,可按以下步骤排查修复:
步骤1:统一flask-jwt-extended版本或对齐身份声明配置
flask-jwt-extended的3.x和4.x大版本存在核心默认配置差异:
- 3.x版本默认的身份声明字段为
identity,对应配置项JWT_IDENTITY_CLAIM = "identity" - 4.x版本默认的身份声明字段为
sub,对应配置项JWT_IDENTITY_CLAIM = "sub"
如果三个服务安装的flask-jwt-extended大版本不同,就会出现auth服务生成的token里身份字段名和其他服务校验的字段名不匹配的问题。
可先在三个服务的运行环境分别执行以下命令查看版本:
pip show flask-jwt-extended
修复方案二选一即可:
- 把三个服务的flask-jwt-extended统一升级/降级到同一个大版本
- 给三个服务都加上统一的身份声明配置,比如统一指定用identity字段:
# 三个服务的配置都加上这一行 JWT_IDENTITY_CLAIM = "identity"
步骤2:校验全量JWT配置一致性
除了你已经确认的SECRET_KEY和JWT_SECRET_KEY外,还需要确认三个服务的以下JWT配置完全相同:
JWT_ALGORITHM:签名算法必须一致,默认是HS256,如果你修改过必须三个服务同步JWT_ENCODE_AUDIENCE/JWT_DECODE_AUDIENCE:如果配置了aud受众声明,必须完全对齐JWT_ISSUER:如果配置了iss签发者声明,必须完全相同
步骤3:校验JWT payload内容
你可以把auth服务生成的access token复制到本地解码,查看payload中的字段:
如果payload中没有
identity字段,说明auth服务的JWT_IDENTITY_CLAIM配置不是identity,把三个服务的该配置统一修改为payload中存储身份的字段名即可
如果payload中存在identity字段,说明你的service服务解码失败,重新校验密钥是否存在大小写、前后空格等差异,确认签名算法一致。
内容的提问来源于stack exchange,提问作者Kimsea Sok
相关产品推荐
相关产品推荐

