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

使用Singpass NdiOidcHelper获取令牌时遇client_assertion验证错误求助

排查Singpass NdiOidcHelper中"Unable to verify client_assertion: no key found"错误

针对你使用@govtechsg/singpass-myinfo-oidc-helper时遇到的客户端断言验证失败问题,可按以下步骤逐一排查:


1. 移除EC密钥中的冗余字段

你的keystore对象包含了e: "AQAB"字段,这是RSA密钥专属参数,EC(P-256)密钥不需要该字段,会干扰密钥解析逻辑,直接删除即可:

const keystore = {
    kty: 'EC',
    kid: 'gfU0OIt2KoTz8JIm6naqVsbyGUs8mtiMr_k5GnLPmxI',
    use: 'sig',
    alg: 'ES256',
    crv: "P-256",
    x  : "SVqB4JcUD6lsfvqMr-OKUNUphdNn64Eay60978ZlL74",
    y  : "lf0u0pMj4lGAzZix5u4Cm5CMQIgMNpkwy163wtKYVKI",
    d  : "0g5vAEKzugrXaRbgKG0Tj2qJ5lMP4Bezds1_sTybkfk"
}

const key = {
    "key": keystore,
    "format": 'json',
    "alg": 'ES256',
}

2. 确认密钥ID(kid)与服务端配置完全匹配

  • 若使用mockpass测试:访问mockpass的JWKS端点(通常为/.well-known/jwks.json),检查返回的密钥列表中是否存在与你kid完全一致的条目,注意大小写、特殊字符必须完全匹配。
  • 若为生产Singpass环境:登录Singpass开发者平台,确认注册客户端时提交的密钥kid与代码中的值完全一致。

3. 验证NdiOidcHelper实例初始化的密钥传入逻辑

确保创建server实例时,正确将签名密钥传入配置项,示例如下:

const { NdiOidcHelper } = require('@govtechsg/singpass-myinfo-oidc-helper');

const server = new NdiOidcHelper({
  clientID: "你的客户端ID",
  clientSecret: "你的客户端密钥",
  redirectUri: "你的回调地址",
  clientAssertionSigningKey: key, // 传入你的key对象
  clientAssertionSigningAlg: 'ES256',
  // 其他必要配置(如issuer、authorizationEndpoint等)
});

4. 检查mockpass的密钥加载配置

若使用mockpass测试,需确保mockpass已加载你使用的EC公钥:

  • 将你的EC公钥(x、y字段)添加到mockpass的JWKS配置文件中;
  • 或直接使用mockpass官方提供的测试EC密钥替换当前密钥,再重新测试。

5. 验证密钥参数的编码格式

EC密钥的x、y、d字段必须为base64url编码(无填充),可通过以下代码验证编码有效性:

// 验证x字段编码
try {
  Buffer.from(keystore.x, 'base64url').toString('hex');
  console.log('x编码有效');
} catch (e) {
  console.error('x编码无效', e);
}

// 同理验证y、d字段

若编码无效,需重新生成符合要求的base64url格式EC密钥参数。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:14:59