我正在编写下面的代码以获得jwt令牌,我想用智能健康卡验证SDK验证它
var jose = require("node-jose");
const {JWS} = require("node-jose");
async function a1(){
try {
const keystore={
keys: [
{
kty: 'EC',
d: 'gLkNmSBFWR67hEu62eVfVWhFbLGl309jOszsocqbexE',
use: 'sig',
crv: 'P-256',
kid: '6d858102402dbbeb0f9bb711e3d13a1229684792db4940db0d0e71c08ca602e1',
x: '5R2yrryD1ztBYnyKyQF5r5kzPUjnVnmR5pMe7H9ykNU',
y: 'VaqqjG0N2rSuijP9P9QiOjX4XEhIl8k8fzA6FZTSMhY',
alg: 'ES256'
}
]
}
const ks = await jose.JWK.asKeyStore(keystore);
const rawKey = ks.get(keystore.keys[0].kid)
const key = await jose.JWK.asKey(rawKey);
const payload =JSON.stringify({ "iss" : "https://spec.smarthealth.cards/examples/issuer", "sub": "1234567890", "name": "John Doe", "iat": 1516239022});
const token =await jose.JWS.createSign( {format: 'compact'},key).update(payload, "utf8").final();
console.log(token);
}catch (err) {
console.log(err);
}
}
a1();我得到了钱:
eyJhbGciOiJFUzI1NiIsImtpZCI6IjZkODU4MTAyNDAyZGJiZWIwZjliYjcxMWUzZDEzYTEyMjk2ODQ3OTJkYjQ5NDBkYjBkMGU3MWMwOGNhNjAyZTEifQ.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkVyaWMgRC4iLCJyb2xlIjoiYWRtaW4iLCJpYXQiOjE1MTYyMzkwMjJ9.dbjb9YHFCWaFYGQYyGDDL1iFvqk1Ed9k3-PAhVx4NtvFml1q0VcpW854IXW_J47f6Vf1otm2WeftVQHjY3K4vg
当我使用这个命令时:
node . --path C:\Users\User\Documents\Saguaro\health-cards-validation-SDK-main\jws.text --type jws在sdk文件中,我得到以下错误:
错误 │·JWS头缺少'zip‘属性。 │·错误膨胀JWS有效载荷。你用过未经处理的压缩吗? │不正确标头检查 JWS验证失败:在发行者集中找不到“│”=│的密钥
请让我知道什么发行人的集合和如何把孩子的价值在发行人的集合。此外,什么是所谓的泄气压缩和如何消除这个问题。请注意:以上是伪码。
发布于 2021-07-13 10:53:29
基本上有两个主要错误:
第一个错误(我将这两条消息视为一个错误的一部分)
·JWS头缺少“zip”属性。 ·膨胀JWS有效载荷的错误。你用过未经处理的压缩吗?
意味着您的令牌格式不正确。
Smart 需要压缩有效载荷 (参见RFC1951)算法和一个值为"DEF“的"zip”头来显示有效负载是压缩的,这是我只在JWE RFC中看到的,而不是针对JWS的。大多数JWT库可能不会为签名的令牌提供减缩的有效负载,节点jose也只支持JWE,因此必须手动完成。
为此,可以使用zlib压缩有效负载并手动将"zip":"DEF"添加到标头:
const zlib = require("zlib");
...
const payload = "{...}" // very long payload, see example in https://mikkel.ca/blog/digging-into-quebecs-proof-of-vaccination/
const payloadBuf = zlib.deflateRawSync(payload)
const token =await jose.JWS.createSign({alg: 'ES256', fields: { zip: 'DEF' }, format: 'compact'}, key).update(payloadBuf, "utf8").final();第二个错误是:
JWS验证失败:在发行者集中找不到带有‘can’= 6d858102402dbbeb0f9bb711e3d13a1229684792db4940db0d0e71c08ca602e1的密钥
这意味着,为了验证您的令牌,需要由给定的keyId (kid)标识的公钥,该密钥应该在您的“发行者集”中提供。
根据链接文件,验证器工具有一个参数
-k, --jwkset <key> path to trusted issuer key set下面描述为: JSON密钥(JWK)集,编码颁发者的公开签名密钥
因此,基本上,您必须将密钥存储作为JWKS (JSON Web密钥集)存储在文件中(例如,JSON Web密钥集),如下所示,并在参数中提供该文件的路径。在您的令牌验证期间,验证器将从令牌头读取kid,并尝试在提供的密钥集中找到相应的密钥。
{
"keys":
[
{
"kty": "EC",
"kid": "6d858102402dbbeb0f9bb711e3d13a1229684792db4940db0d0e71c08ca602e1",
"use": "sig",
"alg": "ES256",
"crv": "P-256",
"x" : "SVqB4JcUD6lsfvqMr-OKUNUphdNn64Eay60978ZlL74",
"y" : "lf0u0pMj4lGAzZix5u4Cm5CMQIgMNpkwy163wtKYVKI"
}
]
}注意:不包括d值(私钥),您应该只显示公钥。
我下载了套餐,向有效载荷中添加了更多必需的数据(示例发现了这里),测试了它,并首先得到了上述错误,在提供参数--jwkset issuerPublicKeys.json之后,该错误消失了。
node . --path jws.txt --type jws --jwkset issuerPublicKeys.json这意味着,jwt可以使用公钥进行验证!
还可以验证密钥集本身:
node . --type jwkset --path issuerPublicKeys.json使用当前值,结果将是:
验证密钥集 │ └─错误 · key6d858102402dbbeb0f9bb711e3d13a1229684792db4940db0d0e71c08ca602e1:>‘#en0#’不匹配发出者键中的拇指指纹。预期:7qE0Y0DyqeOFFREIQSLKfu5WlbckdxVXKFasfcI-DG,实际: 6d858102402dbbeb0f9bb711e3d13a1229684792db4940db0d0e71c08ca602e1 验证已完成
上面提到的指纹和那个孩子一模一样。因此,当您用值"a7qE0Y0DyqeOFFREIQSLKfu5WlbckdxVXKFasfcI-Dg",替换孩子时,错误就消失了:
验证密钥集 验证已完成
https://stackoverflow.com/questions/68356564
复制相似问题