node.js - 用于签署 JSON Web token 的 Google Cloud Key Management Service

标签 node.js google-cloud-platform jwt google-cloud-kms

首先,我尝试了以下解决方案: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 编码/解码步骤应该会产生正确的结果(verify.verify 可以接受 Buffer 作为签名参数)。

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

关于node.js - 用于签署 JSON Web token 的 Google Cloud Key Management Service,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55828435/

相关文章:

node.js - 如何导出描述/测试并在 Jest 另一个测试文件中重用它们

node.js - 如何使用 AWS lambda 验证 S3 中的 zip 结构

node.js - gRPC Node : How to set a field that is of another Message type (with multiple types itself)

java - Google Cloud Java 客户端 : forcing HTTP when setting a custom endpoint

google-cloud-storage - 当对象上传到我的 GCS 存储桶时,如何收到通知?

jwt - Auth0.com,它到底是如何运作的?

mysql - LIKE SQL 语法错误

docker - 使用gcloud推送Docker镜像失败

jwt - 我的 Azure AD B2C token 的 key 在哪里?

go - 在 go 中验证谷歌聊天机器人消息