coze 的jwt和若依冲突解决方案
- Dominant language
- Java
- Stars
- 214
- Forks
- 98
- PR merge metrics
- No merged PRs in 30d
Description
# 问题现象
在使用 coze-api 进行JWT OAuth认证时遇到运行时错误:
```java
Exception in thread "main" java.lang.NoSuchMethodError: io.jsonwebtoken.JwtBuilder.signWith(Ljava/security/Key;Lio/jsonwebtoken/SignatureAlgorithm;)Lio/jsonwebtoken/JwtBuilder;
at com.coze.openapi.service.auth.DefaultJWTBuilder.generateJWT(DefaultJWTBuilder.java:25)
at com.coze.openapi.service.auth.JWTOAuthClient.doGetAccessToken(JWTOAuthClient.java:114)
at com.coze.openapi.service.auth.JWTOAuthClient.getAccessToken(JWTOAuthClient.java:52)
at com.ruoyi.coze.controller.JWTOAuthExample.main(JWTOAuthExample.java:95)
```
# 根本原因分析
核心问题:JWT库版本冲突
项目中同时存在多套JWT相关依赖:
项目原有依赖 (ruoyi-common):
io.jsonwebtoken:jjwt-api:0.9
io.jsonwebtoken:jjwt-impl:0.9
io.jsonwebtoken:jjwt-jackson:0.9
coze-api自带依赖:
com.auth0:java-jwt:3.18.2
io.jsonwebtoken:jjwt-api:0.11.5
io.jsonwebtoken:jjwt-impl:0.11.5
io.jsonwebtoken:jjwt-jackson:0.11.5
冲突机制:
不同版本的JWT库API签名不兼容
类加载器无法确定使用哪个版本的方法实现
运行时调用到错误版本的方法签名
# 问题诊断过程
1. 依赖树分析
```java
mvn dependency:tree -pl ruoyi-tax | grep -E "(jwt|coze)"
```
发现多个JWT库同时存在:
```java
[INFO] \- com.coze:coze-api:jar:0.3.2:compile
[INFO] +- com.auth0:java-jwt:jar:3.18.2:compile
[INFO] +- io.jsonwebtoken:jjwt-api:jar:0.11.5:compile
[INFO] +- io.jsonwebtoken:jjwt-impl:jar:0.11.5:runtime
[INFO] +- io.jsonwebtoken:jjwt-jackson:jar:0.11.5:runtime
```
# 解决方案
## 方案一
升级父项目依赖,使依赖保持一致:
pom.xml中改为:
```java
0.11.5
```
然后清理 maven:

## 方案二
业务项目中移除依赖:
```java
com.coze
coze-api
0.3.2
com.ruoyi
ruoyi-common
io.jsonwebtoken
jjwt
io.jsonwebtoken
jjwt-api
io.jsonwebtoken
jjwt-impl
io.jsonwebtoken
jjwt-jackson
```
补充:两种方案可以同时使用,在我的测试中,方案一执行后清理 maven 后依然不行,方案二也不行,第二天起来丢给 ai 分析了一波(可能是用命令清理了缓存还是什么,就可以了),删除了方案二的代码依旧可行,我的最终代码是保留了方案一
Contributor guide
Assessment
This issue has not been assessed yet.