Google Cloud 密钥管理服务签署 JSON Web 令牌

2024-01-23

首先我尝试了以下解决方案:使用 Google Cloud Key Management Service 签署 JSON Web 令牌 https://stackoverflow.com/questions/54250511/using-google-cloud-key-management-service-to-sign-json-web-tokens但这不起作用。

创建签名:

const TimeStamp = Math.floor(new Date().getTime() / 1000)

let body = base64url(
    JSON.stringify({
        alg: 'RS256',
        typ: 'JWT'
    })
)
body += '.'
body += base64url(
    JSON.stringify({
        iss: 'some-iss',
        aud: 'some-aud',
        iat: TimeStamp,
        exp: TimeStamp + parseInt(process.env.TOKEN_EXPIRY, 10)
    })
)

const hashedMessage = crypto
                .createHash('sha256')
                .update(body)
                .digest('base64')
const digest = { sha256: hashedMessage }

const [signatureObj] = await client
    .asymmetricSign({ name, digest })
    .catch(console.error)

const signature = base64url(signatureObj.signature)
const token = `${body}.${signature}`

然后验证:

const[publicKeyObject] = await client.getPublicKey({ name }).catch(console.error)
const publicKey = publicKeyObject.pem

const verify = crypto.createVerify('sha256')
verify.write(body)
verify.end()
verify.verify(publicKey, base64url.decode(signature), 'base64')

我无法弄清楚代码有什么问题。


signatureObj.signature是一个缓冲区,而不是一个字符串。遗憾的是,文档在这一点上是不正确的。

跳过 Base64 编码/解码步骤应该会产生正确的结果(验证.验证 https://nodejs.org/api/crypto.html#crypto_verify_verify_object_signature_signatureencoding可以接受 Buffer 作为签名参数)。

为了将签名的内容实际编码到 JWT 中,您需要类似的东西signatureObj.signature.toString('base64').

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google Cloud 密钥管理服务签署 JSON Web 令牌 的相关文章

随机推荐