coze-dev / coze-dev/coze-java

coze 的jwt和若依冲突解决方案

Đang mở
#103 3 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
Java
Star
214
Fork
98
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

# 问题现象

在使用 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:

![](https://cdn.nlark.com/yuque/0/2025/png/25461556/1749085094639-95780c26-c838-4908-9489-e76e52ae7bd8.png)

## 方案二

业务项目中移除依赖:

```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 分析了一波(可能是用命令清理了缓存还是什么,就可以了),删除了方案二的代码依旧可行,我的最终代码是保留了方案一

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Hướng nghiên cứu

Bắt đầu với các mục trong stack trace của DefaultJWTBuilder.generateJWT và JWTOAuthClient.doGetAccessToken, sau đó kiểm tra cây dependency liên quan trong pom.xml để tìm các phiên bản jjwt ở ruoyi-tax, ruoyi-common và coze-api. Xác nhận phiên bản JWT đã được resolve và xác minh rằng ví dụ OAuth không còn phát sinh NoSuchMethodError sau một Maven build sạch.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
java
Lĩnh vực
api, authentication, backend
Loại issue
Lỗi
Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
38/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.