gpt4 book ai didi

node.js - 智能健康卡 token 验证失败

转载 作者:行者123 更新时间:2023-12-04 07:23:26 25 4
gpt4 key购买 nike

我正在编写下面的代码来获取 jwt token ,我想用它来验证
SMART Health Cards Validation 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();
我得到 token :

eyJhbGciOiJFUzI1NiIsImtpZCI6IjZkODU4MTAyNDAyZGJiZWIwZjliYjcxMWUzZDEzYTEyMjk2ODQ3OTJkYjQ5NDBkYjBkMGU3MWMwOGNhNjAyZTEifQ.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkVyaWMgRC4iLCJyb2xlIjoiYWRtaW4iLCJpYXQiOjE1MTYyMzkwMjJ9.dbjb9YHFCWaFYGQYyGDDL1iFvqk1Ed9k3-PAhVx4NtvFml1q0VcpW854IXW_J47f6Vf1otm2WeftVQHjY3K4vg


当我使用这个命令时:
node . --path C:\Users\User\Documents\Saguaro\health-cards-validation-SDK-main\jws.text --type jws
在 sdk 文件中,我收到以下错误:

Error
│ · JWS header missing 'zip' property.
│ · Error inflating JWS payload. Did you use raw DEFLATE compression?
│ incorrect header check
│ · JWS verification failed: can't find key with 'kid' = 6d858102402dbbeb0f9bb711e3d13a1229684792db4940db0d0e71c08ca602e1 in issuer set


请让我知道发行者集合以及如何将 child 值(value)放入发行者集合中。
另外,放气压缩是什么意思以及如何解决这个问题。
请注意:以上为伪代码。

最佳答案

你基本上有两个主要错误:
第一个(我将这两条消息计为一个错误的一部分)

· JWS header missing 'zip' property.
· Error inflating JWS payload. Did you use raw DEFLATE compression?


表示您的 token 格式不正确。
智能健康卡 require a compressed payload , 使用 DEFLATE (见 RFC1951 ) 算法, 和一个值为 "DEF"的 "zip" header 来显示有效负载是压缩的, 我只看到在 JWE RFC 中定义的东西,但不适用于 JWS。大多数 JWT 库可能不为签名 token 提供压缩有效负载,并且 node-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 verification failed: can't find key with 'kid' = 6d858102402dbbeb0f9bb711e3d13a1229684792db4940db0d0e71c08ca602e1 in issuer set


这意味着为了验证您的 token ,需要由给定的 keyId (kid) 标识的公钥,并且该 key 应在您的“颁发者集”中提供。
根据 linked documentation验证器工具有一个参数
 -k, --jwkset <key>         path to trusted issuer key set
进一步描述为:JSON Web Key (JWK) Set,编码颁发者公共(public)签名 key
所以基本上你必须将你的 keystore 作为 JWKS ( JSON Web Key Set) 存储在一个文件中(例如 issuerPublicKeys.json)
如下所示,并在参数中提供该文件的路径。在验证您的 token 期间,验证器将读取 kid从 token 头中并尝试在提供的 key 集中找到相应的 key 。
{
"keys":
[
{
"kty": "EC",
"kid": "6d858102402dbbeb0f9bb711e3d13a1229684792db4940db0d0e71c08ca602e1",
"use": "sig",
"alg": "ES256",
"crv": "P-256",
"x" : "SVqB4JcUD6lsfvqMr-OKUNUphdNn64Eay60978ZlL74",
"y" : "lf0u0pMj4lGAzZix5u4Cm5CMQIgMNpkwy163wtKYVKI"
}
]
}
注: d值(私钥)不包括在内,您只应该显示公钥。
我下载了 package ,在有效载荷中添加了一些更多需要的数据(示例找到 here ),对其进行测试并首先得到上述错误,在提供参数后消失了 --jwkset issuerPublicKeys.json :
node . --path jws.txt --type jws --jwkset issuerPublicKeys.json
这意味着,可以使用公钥验证 jwt!
Keyset 本身也可以被验证:
node . --type jwkset --path issuerPublicKeys.json
使用当前值,结果将是:

Validate Key-Set

└─ Error
·
key[6d858102402dbbeb0f9bb711e3d13a1229684792db4940db0d0e71c08ca602e1]: >'kid' does not match thumbprint in issuer key. expected: a7qE0Y0DyqeOFFREIQSLKfu5WlbckdxVXKFasfcI-Dg, actual:
6d858102402dbbeb0f9bb711e3d13a1229684792db4940db0d0e71c08ca602e1
Validation completed


提到的指纹与 child 相同。所以当你用值“a7qE0Y0DyqeOFFREIQSLKfu5WlbckdxVXKFasfcI-Dg”替换 child 时,错误消失了:

Validate Key-Set
Validation completed

关于node.js - 智能健康卡 token 验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68356564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com