coze-dev / coze-dev/coze-java

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

Ouverte
#103 3 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
Langage dominant
Java
Étoiles
214
Forks
98
Métriques de merge des PR
Aucune PR mergée en 30 j

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:

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

Guide de contribution

Ouvrir le guide de contribution

Piste de recherche

Commencez par les entrées de la trace de la pile de DefaultJWTBuilder.generateJWT et JWTOAuthClient.doGetAccessToken, puis examinez l’arbre des dépendances pertinent de pom.xml pour les versions de jjwt dans ruoyi-tax, ruoyi-common et coze-api. Confirmez la version de JWT résolue et vérifiez que l’exemple OAuth ne lève plus NoSuchMethodError après une compilation Maven propre.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
java
Domaine
api, authentication, backend
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
38/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.