You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NuxtJS(v2.15.8)签名JWT报错:无法读取null的属性'2'

问题排查与修复方案

1. 核心错误原因:私钥格式不正确

报错Cannot read properties of null (reading '2')是因为Node.js的crypto模块无法正确解析服务账号私钥,大概率是环境变量中存储的私钥丢失了换行符。服务账号私钥的标准格式包含首尾标记及中间换行:

-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC...
...
...
-----END PRIVATE KEY-----

如果环境变量中将换行符替换为空格或直接删除,crypto解析时会直接失败。

修复方法:

  • 在Nuxt的.env配置文件中,用双引号包裹私钥,并用\n保留换行符:
    PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC...\n...\n-----END PRIVATE KEY-----"
    
  • 代码中使用时将\n替换为实际换行:
    const private_key = options.private_key.replace(/\\n/g, '\n');
    

2. 代码细节问题修正

(1)JWT Header与Body需遵循JSON规范

JWT要求Header和Body必须用双引号包裹键值对,当前代码使用单引号不符合标准,可能导致后续验证失败:

// 修正Header
const header = JSON.stringify({
  alg: 'RS256',
  typ: 'JWT',
  kid: private_key_id
});
// 修正Body
const body = JSON.stringify({
  iss: client_email,
  aud: oauth_token_uri,
  exp: expires_at,
  iat: issued_at,
  sub: client_email,
  target_audience: iap_client_id
});

(2)Assertion无需Buffer包装

header_base64、body_base64、signature_base64均为字符串,直接拼接即可,不需要转为Buffer:

const assertion = `${header_base64}.${body_base64}.${signature_base64}`;

(3)简化签名流程

无需手动创建Buffer传递给sign.write,直接传入字符串即可:

const sign = crypto.createSign('SHA256');
sign.write(`${header_base64}.${body_base64}`);
sign.end();
const signature_base64 = sign.sign(private_key, 'base64');

3. 推荐使用官方库避免手动实现

手动签名JWT容易出现格式错误,Google官方提供的google-auth-library可自动处理JWT签名、令牌获取及刷新逻辑,稳定性更高:

const { GoogleAuth } = require('google-auth-library');

async function getIAPToken() {
  const auth = new GoogleAuth({
    credentials: {
      private_key: options.private_key.replace(/\\n/g, '\n'),
      client_email: options.client_email
    }
  });

  // 获取用于访问IAP的ID Token
  const client = await auth.getIdTokenClient(iap_client_id);
  const idToken = await client.idTokenProvider.fetchIdToken(iap_client_id);
  
  return idToken;
}

内容的提问来源于stack exchange,提问作者FabioC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 02:01:13