Google Cloud Key Management Service для подписи веб-токенов JSON - PullRequest
2 голосов
/ 24 апреля 2019

Прежде всего, я попробовал решение по адресу: Использование службы управления облачными ключами Google для подписи веб-токенов JSON Но это не работает.

Создание подписи:

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')

Я не могу понять, что не так с кодом.

1 Ответ

3 голосов
/ 24 апреля 2019

signatureObj.signature - это буфер, а не строка.К сожалению, в этом отношении документация неверна.

Пропуск шагов кодирования / декодирования base64 должен дать надлежащие результаты ( verify.verify может принять буфер в качестве аргумента подписи).

Для фактического кодирования содержимого подписи в JWT вам понадобится что-то вроде signatureObj.signature.toString('base64').

...