coze-js icon indicating copy to clipboard operation
coze-js copied to clipboard

getJWTToken()方法请求token失败

Open Gaiyu-Alexader opened this issue 1 month ago • 3 comments

按照client中的例子用getJWTToken()方法请求access token时,最后返回verify jwt empty error,这个问题怎么解决呢

Gaiyu-Alexader avatar Nov 01 '25 11:11 Gaiyu-Alexader

正在帮您查询中,请稍等...

根据提供的信息,用户在使用 getJWTToken() 方法时遇到 "verify jwt empty error",这通常是由于 JWT 生成过程中关键参数缺失或私钥无效导致的。以下是具体解决方案:

1. 检查 JWT 生成的必要参数

getJWTToken() 方法需要以下参数(参考 Node.js 配置访问密钥):

参数 说明 是否必须
baseURL 扣子 API 端点(国内环境为 https://api.coze.cn
appId OAuth 应用的客户端 ID(创建 OAuth 应用时获取)
aud 固定为 api.coze.cn
keyid 公钥指纹(在 OAuth 应用详情页的「公钥」部分查看)
privateKey 本地私钥文件内容(需包含 -----BEGIN PRIVATE KEY----- 头部和尾部)

常见错误场景

  • 私钥未正确读取:例如文件路径错误、私钥内容为空或格式错误(如缺失换行符)。
  • 参数传递不完整:例如漏传 keyidaud

2. 验证私钥格式与读取方式

私钥必须是 未经修改的 PEM 格式,且需通过文件读取或环境变量正确传入。示例代码如下:

import fs from 'fs';
import { getJWTToken } from '@coze/api';

// 读取私钥文件(确保路径正确)
const privateKey = fs.readFileSync('/path/to/private_key.pem', 'utf-8').trim();

// 调用 getJWTToken 方法
const result = await getJWTToken({
  baseURL: 'https://api.coze.cn', // 国内环境固定值
  appId: 'your_oauth_client_id',  // 替换为 OAuth 应用的 Client ID
  aud: 'api.coze.cn',             // 固定值,不可修改
  keyid: 'your_public_key_fingerprint', // 替换为公钥指纹
  privateKey: privateKey          // 确保私钥内容正确
});

注意

  • 私钥文件中不可包含额外空格或注释,需严格保留 -----BEGIN PRIVATE KEY----------END PRIVATE KEY-----
  • 若通过环境变量传递私钥,需确保环境变量值完整(避免换行符被截断)。

3. 检查 OAuth 应用配置

  1. 确认 OAuth 应用类型:必须创建 JWT 类型的 OAuth 应用(参考 OAuth JWT 授权(开发者))。
  2. 公钥指纹匹配keyid 参数需与 OAuth 应用详情页中的 公钥指纹 完全一致(区分大小写)。
  3. 应用状态:确保 OAuth 应用未被禁用(在「应用管理」中检查状态为「启用」)。

4. 错误排查步骤

  1. 打印参数值:在调用 getJWTToken() 前,输出所有参数值,确认无空值或格式错误:

    console.log('参数检查:', { appId, keyid, privateKey.length, aud });
    // 确保 privateKey.length > 0,且包含完整的 PEM 头部
    
  2. 验证私钥有效性:使用 jsonwebtoken 库手动生成 JWT 测试(需安装依赖 npm install jsonwebtoken):

    import jwt from 'jsonwebtoken';
    
    const payload = {
      iss: appId,
      aud: 'api.coze.cn',
      exp: Math.floor(Date.now() / 1000) + 3600, // 有效期 1 小时
      jti: uuid.v4() // 生成唯一 ID
    };
    
    const token = jwt.sign(payload, privateKey, { 
      algorithm: 'RS256', 
      header: { kid: keyid } 
    });
    console.log('手动生成 JWT:', token); // 若失败则私钥或 keyid 有误
    
  3. 检查 SDK 版本:确保 @coze/api 版本为最新(npm update @coze/api),避免旧版本 bug。

5. 参考文档

总结

"verify jwt empty error" 的核心原因是 JWT 生成失败,需重点检查:

  • 私钥文件读取是否成功,内容是否完整。
  • keyid(公钥指纹)是否与 OAuth 应用配置一致。
  • 所有必要参数(appIdaudbaseURL)是否正确传递。

通过逐步验证上述步骤,可定位并解决问题。> 正在帮您查询中,请稍等...

根据提供的信息,用户在使用 getJWTToken() 方法时遇到 "verify jwt empty error",这通常是由于 JWT 生成过程中关键参数缺失或私钥无效导致的。以下是具体解决方案:

1. 检查 JWT 生成的必要参数

getJWTToken() 方法需要以下参数(参考 Node.js 配置访问密钥):

参数 说明 是否必须
baseURL 扣子 API 端点(国内环境为 https://api.coze.cn
appId OAuth 应用的客户端 ID(创建 OAuth 应用时获取)
aud 固定为 api.coze.cn
keyid 公钥指纹(在 OAuth 应用详情页的「公钥」部分查看)
privateKey 本地私钥文件内容(需包含 -----BEGIN PRIVATE KEY----- 头部和尾部)

常见错误场景

  • 私钥未正确读取:例如文件路径错误、私钥内容为空或格式错误(如缺失换行符)。
  • 参数传递不完整:例如漏传 keyidaud

2. 验证私钥格式与读取方式

私钥必须是 未经修改的 PEM 格式,且需通过文件读取或环境变量正确传入。示例代码如下:

import fs from 'fs';
import { getJWTToken } from '@coze/api';

// 读取私钥文件(确保路径正确)
const privateKey = fs.readFileSync('/path/to/private_key.pem', 'utf-8').trim();

// 调用 getJWTToken 方法
const result = await getJWTToken({
  baseURL: 'https://api.coze.cn', // 国内环境固定值
  appId: 'your_oauth_client_id',  // 替换为 OAuth 应用的 Client ID
  aud: 'api.coze.cn',             // 固定值,不可修改
  keyid: 'your_public_key_fingerprint', // 替换为公钥指纹
  privateKey: privateKey          // 确保私钥内容正确
});

注意

  • 私钥文件中不可包含额外空格或注释,需严格保留 -----BEGIN PRIVATE KEY----------END PRIVATE KEY-----
  • 若通过环境变量传递私钥,需确保环境变量值完整(避免换行符被截断)。

3. 检查 OAuth 应用配置

  1. 确认 OAuth 应用类型:必须创建 JWT 类型的 OAuth 应用(参考 OAuth JWT 授权(开发者))。
  2. 公钥指纹匹配keyid 参数需与 OAuth 应用详情页中的 公钥指纹 完全一致(区分大小写)。
  3. 应用状态:确保 OAuth 应用未被禁用(在「应用管理」中检查状态为「启用」)。

4. 错误排查步骤

  1. 打印参数值:在调用 getJWTToken() 前,输出所有参数值,确认无空值或格式错误:

    console.log('参数检查:', { appId, keyid, privateKey.length, aud });
    // 确保 privateKey.length > 0,且包含完整的 PEM 头部
    
  2. 验证私钥有效性:使用 jsonwebtoken 库手动生成 JWT 测试(需安装依赖 npm install jsonwebtoken):

    import jwt from 'jsonwebtoken';
    
    const payload = {
      iss: appId,
      aud: 'api.coze.cn',
      exp: Math.floor(Date.now() / 1000) + 3600, // 有效期 1 小时
      jti: uuid.v4() // 生成唯一 ID
    };
    
    const token = jwt.sign(payload, privateKey, { 
      algorithm: 'RS256', 
      header: { kid: keyid } 
    });
    console.log('手动生成 JWT:', token); // 若失败则私钥或 keyid 有误
    
  3. 检查 SDK 版本:确保 @coze/api 版本为最新(npm update @coze/api),避免旧版本 bug。

5. 参考文档

总结

"verify jwt empty error" 的核心原因是 JWT 生成失败,需重点检查:

  • 私钥文件读取是否成功,内容是否完整。
  • keyid(公钥指纹)是否与 OAuth 应用配置一致。
  • 所有必要参数(appIdaudbaseURL)是否正确传递。

通过逐步验证上述步骤,可定位并解决问题。{"msg_type":"empty result","data":"empty result","from_module":null,"from_unit":null}{"msg_type":"generate_answer_finish","data":"","from_module":null,"from_unit":null}{"msg_type":"generate_answer_finish","data":"{"finish_reason":0,"FinData":""}","from_module":null,"from_unit":null}

coze-js-bot[bot] avatar Nov 01 '25 11:11 coze-js-bot[bot]

海外版访问地址是api.coze.com,也需要改成api.coze.cn吗

Gaiyu-Alexader avatar Nov 01 '25 14:11 Gaiyu-Alexader

Image

Gaiyu-Alexader avatar Nov 01 '25 15:11 Gaiyu-Alexader