编辑:我找到了答案。滚动到这个问题的底部。
我正在使用 NodeJS 身份验证服务器,我想使用谷歌签名签署 JSON Web 令牌(JWT)。
我正在使用 Google Cloud Key Management Service (KMS),并创建了一个密钥环和一个非对称签名密钥。
这是我获取签名的代码:
signatureObject = await client.asymmetricSign({ name, digest })
signature = signatureObject["0"].signature
我的 Google 签名对象如下所示:
我的问题:如何使用 Google 签名签署 JWT?
或者换句话说,如何将 Google 签名连接到 JWT 的 (header.payload)?
JWT 应该如下所示:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ. (GoogleSignature)
我正在使用的代码:
签署:
async function sign(message, name) {
hashedMessage = crypto.createHash('sha256').update(message).digest('base64');
digest = { 'sha256': hashedMessage }
signatureObject = await client.asymmetricSign({ name, digest }).catch((err) => console.log(err))
signature = signatureObject["0"].signature
signJWT(signature)
}
创建 JWT:
function signJWT(signature) {
header = {
alg: "RS256",
typ: "JWT"
}
payload = {
sub: "1234567890",
name: "John Doe",
iat: 1516239022
}
JWT = base64url(JSON.stringify(header)) + "." +
base64url(JSON.stringify(payload)) + "." +
???signature??? ; // what goes here?
}
验证:
async function validateSignature(message, signature) {
// Get public key
publicKeyObject = await client.getPublicKey({ name }).catch((err) => console.log(err))
publicKey = publicKeyObject["0"].pem
//Verify signature
var verifier = crypto.createVerify('sha256');
verifier.update(message)
var ver = verifier.verify(publicKey, signature, 'base64')
// Returns either true for a valid signature, or false for not valid.
return ver
}
答案:
我可以像这样使用 toString() 方法:
signatureString = signature.toString('base64');
然后我可以通过使用获得原始签名八位字节流
var buffer = Buffer.from(theString, 'base64');