使用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
相关产品推荐
相关产品推荐

