以最小的代码占用空间在 nodejs 中验证和解码 Cognito JWT

Verify and decode Cognito JWT in nodejs with smallest code footprint

我有一个使用 Cognito 身份验证作为 AWS Lambda 函数运行的应用程序。一切正常,但现在我正在尝试优化包大小以减少冷启动时间。

JWT 的验证和解码过程涉及:

当我查看存档中的 node_modules 时,最大的包都与上述步骤相关:

elliptic 140kb
bn.js 108kb
jsonwebtoken 84kb
hash.js 80kb
asn1.js 72kb
hmac-drbg 36kb
jwk-to-pem 32kb

Total ~550kb

这超过了 node_modules 大小的一半,我的应用程序代码只有 164kb 未缩小,因此您可以看到 JWT 解码对整体包大小有重大影响。

想知道是否有更轻的替代品...

感谢任何建议

鉴于“从内部 AWS 端点获取 JWK”步骤是从 JSON Web 密钥集获取,jose 版本 3.x 模块可以为您完成所有工作。

磁盘大小更大,但那是因为它是一个通用模块,并且还为 web 捆绑了运行时,包括 esm 和 cjs 风格,但不要担心 - 在您的运行时中,它只需要节点运行时文件和有 0 个依赖项。你可以使用 rollup 来摇树所有你没有使用的权重(其他子模块和运行时文件)。

import jwtVerify from 'jose/jwt/verify'
import createRemoteJWKSet from 'jose/jwks/remote'

const JWKS = createRemoteJWKSet(new URL('https://www.googleapis.com/oauth2/v3/certs'))

const { payload, protectedHeader } = await jwtVerify(token, JWKS, {
  issuer: 'urn:example:issuer',
  audience: 'urn:example:audience'
})