我正在使用谷歌KMS(https://cloud.google.com/kms/)使用非对称签名密钥对节点中的JSON Web令牌(jwt)进行签名。js应用程序。
我能够创建标头和有效载荷,并与谷歌KMS nodejs库(https://github.com/googleapis/nodejs-kms)我可以签署令牌。
但似乎生成的令牌无效。
事实上,我正在执行以下步骤来生成令牌:
此令牌总是带来错误(无效签名)。看https://jwt.io/
验证令牌的公钥:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmv3Slq7ofruWhFRXmnvt
/4WQuoJtoF2UQMtXmsZAZSODalklN21lV9t1ECAXOyOQX7E2QF8RZfJow5ImeTM5
WWHDhvFcg1/rI6bPIkkp4+Lu4Ljo8IIfYkEbIHt8+yOumEqiA1cvBR1TbojHMl4C
XW8jS4y4g7U6ZNYqKxOh9yvX6yUE0WRSzffRNVvx+Z5SNpmyjOXH/8A8e9BpG8tl
tAwdbtLd7Z+hcr60IERSWgqxnzUwzFWqdo4VNgLG68b1lKocbL8f0SnZiG0huyh0
tUEntR7PFWDePc2fOJmY9N9phgoD5FQjUQQiNipZi/Jw/z/BUz+utmQHwHNqyvCQ
ZQIDAQAB
-----END PUBLIC KEY-----
构建jwt的代码如下:
const kms = require('@google-cloud/kms');
const crypto = require('crypto');
const base64url = require('base64url');
async function main() {
const client = new kms.KeyManagementServiceClient({
keyFilename: "./googleCloudKey.json"
});
const projectId = '...';
const locationId = 'europe';
const keyRingId = '...';
const cryptoKeyId = '...';
const cryptoKeyVersion = '1';
const header = base64url(JSON.stringify({
"alg": "RS256",
"typ": "JWT",
"issuer": "login.myapp.com",
"audience": "*.myapp.com"
}));
const payload = base64url(JSON.stringify({
"userId": "1234567890",
"userName": "John Doe"
}));
const digest = crypto.createHash("sha256").update(Buffer.from(`${header}.${payload}`, "base64")).digest("base64");
const name = client.cryptoKeyVersionPath(
projectId,
locationId,
keyRingId,
cryptoKeyId,
cryptoKeyVersion
);
try {
const result = await client.asymmetricSign({
name: name,
digest: {
sha256: digest
}
});
const signature = base64url.fromBase64(result[0].signature.toString("base64"));
console.log("====== HEADER =====");
console.log(header);
console.log();
console.log("====== PAYLOAD =====");
console.log(payload);
console.log();
console.log("====== SIGNATURE =====");
console.log(signature);
console.log();
console.log();
console.log("===== JWT =====");
console.log(`${header}.${payload}.${signature}`);
} catch(e) {
console.error(e);
}
}
main().catch(console.error);
生成的令牌如下(=最后一个console.log
的输出):
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImlzc3VlciI6ImxvZ2luLm15YXBwLmNvbSIsImF1ZGllbmNlIjoiKi5teWFwcC5jb20ifQ.eyJ1c2VySWQiOiIxMjM0NTY3ODkwIiwidXNlck5hbWUiOiJKb2huIERvZSJ9.WVdM2NT5IGYKuCMV393yD7grA4GyVIrorL2OF-MHcRZESwPC3bOZIsx254IkMDInFyui74N6qEpHIe6UpR1JeuojMaGEANvSE0TtFpYgykU7xORmVEsjuZSYyKeEaTPAMwmXVPEKi5gQA9qlfQjTXE-h1xWYt2N3-pj2IHcgpgC-tarN1_TLNxZ5it2TrfpfGztI13L5WHYEFidExde9sxasvJsHZR3ax0wnoPn9V9rfqdXrEtG6-cdi9PAQprQClVOETtvpZNcCZpIlciHsaYBla5JjowbUmecSjQ54F-CuOggxvGvy16uG9p93ETlUyAknPTCGaMf9URyKkssYaw
在此片段中:
Buffer.from(`${header}.${payload}`, "base64")
您正在对标头和有效负载的串联进行base64解码。但是JWS规范并不要求这样做。https://www.rfc-editor.org/rfc/rfc7515#section-5.1
我正在尝试手动创建ES256 JWT令牌。我有一个用python编写的小脚本,它对使用ecdsa python的sha256哈希进行签名。但签名在jwt上无效。木卫一。 繁殖步骤: 创建Base64报头负载: eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9。EYJZDWIixMJ0Nty3ODKwiiBmFtzSi6IkPvAg4GrG9LiiWiyWrTaw4Ionry
我们使用java-jwt编写了小API。当我创建令牌并在代码中验证令牌时,Java正常工作。 创建RSA私钥和公钥。(参考其中一个测试用例) 使用算法创建令牌。RS256与私钥。 验证了相同的令牌,并获得了预期的输出。 然后向客户端提供公钥,我们开始使用生成的令牌调用他们的REST服务。客户端使用https://www.npmjs.com/package/jsonwebtoken来验证令牌。他们回
通过以下命令提到留档,我试图生成签名apk android和得到以下错误 按照此链接生成生产apk http://facebook.github.io/react-native/docs/signed-apk-android.html 生成后通过以下命令构建apk成功生成 但是在安装apk启动后崩溃,并出现以下错误。
我正在尝试生成签名APK。但由于生成时的lint错误而无法生成。我检查了我的lint报告,它在我的XML文件中显示错误。 林特在组装释放目标时发现致命错误。要继续,要么修复lint识别的问题,要么修改构建脚本,如下所示:...android{lintOptions{checkReleaseBuilds false//或者,如果您愿意,您可以继续检查版本构建中的错误,//但即使发现错误,也可以继续构
我使用docusign进行数字签名,在这里我必须创建一个jwt令牌。为此,我一直在使用git repo的代码https://github.com/docusign/docusign-python-client. 得到以下错误引起MaxRetryError(_pool,url,错误或响应错误(原因))urllib3.exceptions.MaxRetryError:HTTPSConnectionpo
我被这个困扰了大约3天。基本上,我正在尝试使用Tymon在laravel中生成JWT令牌。这是我的控制器文件。 我使用Chrome postman测试了此api,但它报告了以下错误: JWT.php第73行出现错误异常:传递给Tymon\JWTAuth\JWT::fromUser()的参数1必须是第217行上的Tymon\JWTAuth\Contracts\JWTSubject、App\User给