使用 jose 创建 JWK 和 JWS,但是出现错误“不支持的算法”

问题描述

我必须使用 ES256 算法加密负载。还必须在 JWK 中使用 Kid,如下面的代码所述。我正在使用 jose 库来创建签名。代码如下:

var jose = require("node-jose");

async function a1(){
    try {
    const keystore = [
  {
    kty: 'EC',kid: '6d858102402dbbeb0f9bb711e3d13a1229684792db4940db0d0e71c08ca602e1',use: 'sig',alg:'ES256'
  }
]
const ks = await jose.JWK.asKeyStore(keystore);
const rawKey = ks.get(keystore[0].kid)
const key =  await jose.JWK.asKey(rawKey);

const payload =JSON.stringify({"sub": "1234567890","name": "Eric D.","role": "admin","iat": 1516239022});
    
const token =await jose.JWS.createSign({alg: "ES256",format: 'compact'},key).update(payload,"utf8").final();

    }catch (err) {
    console.log(err);
  }
    
}
a1();

但我收到错误

不支持的算法。

请告诉我为什么会出现此问题。

解决方法

alg 参数 ({alg: 'ES256'}) 是正确的,但提供的 JWK 不完整,缺少 some parameters

您必须提供曲线 (crv)、x 和 y 坐标 (xy) 和 ECC 私钥 (d)。

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

上例中 x、y 和 d 的值取自 this article,但通常您必须生成自己的密钥,这也在链接的文章中描述或使用 {{3} }}。

结果将是一个签名令牌:

eyJhbGciOiJFUzI1NiIsImtpZCI6IjZkODU4MTAyNDAyZGJiZWIwZjliYjcxMWUzZDEzYTEyMjk2ODQ3OTJkYjQ5NDBkYjBkMGU3MWMwOGNhNjAyZTEifQ.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkVyaWMgRC4iLCJyb2xlIjoiYWRtaW4iLCJpYXQiOjE1MTYyMzkwMjJ9.gmVcj7rcENUDesVOSKRzvcMbxT_3zf2Sz771pdy3E1t4P-aKFxV1Vkcry2gvoQ1k11xvE0RSs3jYa13qsjFAzg

注意:令牌是签名令牌,有效载荷未加密。如果您需要/要求有效负载加密,请考虑创建加密令牌 (JWE)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...