我正在构建一个 Web 应用程序,在其中使用 AWS 托管 UI 对用户进行身份验证,这会向我返回一个 jwt 令牌。现在我正在尝试开发,以便我可以解码该令牌以检索使用 AWS 托管 UI 登录的用户的用户 ID,这样我就可以使用其 UserID(这是 的分区键)从 DynamoDB 呈现他们的数据他们的所有数据。我查看了有关如何在 TypeScript 中解码 jwt 令牌的文档,但似乎没有任何效果。有人可以帮助我并指导我走向正确的方向/指导我参考代码示例来实现这一点吗?
*注意:我已经查看了此文档 -> https://github.com/awslabs/aws-support-tools/blob/master/Cognito/decode-verify-jwt/decode-verify-jwt.ts但没有任何运气。
谢谢您!
如果您使用 TypeScript 4 或更高版本,我建议查看 aws-jwt-verify 存储库:https://github.com/awslabs/aws-jwt-verify。
这是一个 JavaScript 库,用于验证 Amazon Cognito 签名的 JWT 以及使用 RS256 / RS384 / RS512 签名 JWT 的任何与 OIDC 兼容的 IDP。该库可与 Node.js 14 或更高版本一起使用(支持 CommonJS 和 ESM)。如果与 TypeScript 一起使用,则需要 TypeScript 4 或更高版本。
这可能是您前进的最快路径。基本用法示例适合您。这不仅会为您验证令牌,还会对其进行解码并返回 JWT 声明。
这是一个示例,理想情况下您可以将编码的 JWT 提供给
payload
常量:
import { CognitoJwtVerifier } from "aws-jwt-verify";
const verifier = CognitoJwtVerifier.create({
userPoolId: "<user_pool_id>",
tokenUse: "access",
clientId: "<client_id>",
});
try {
const payload = await verifier.verify(
"eyJraWQeyJhdF9oYXNoIjoidk..." // the JWT as string
);
console.log("Token is valid. Payload:", payload);
} catch {
console.log("Token not valid!");
}
如果令牌有效,您的回复将如下所示:
Token is valid. Payload: {
sub: '0145dc99-d44e-4195-ae17-exampleSUB',
iss: 'https://cognito-idp.<region>.amazonaws.com/<user-pool-id>',
client_id: '7qfali14b8oq2rexampleAppClient',
origin_jti: '486b02b1-d9ad-4551-9fb8-exampleOriginJTI',
event_id: '40bc33fc-6582-40ed-b719-exampleEventID',
token_use: 'access',
scope: '<scopes>',
auth_time: 17114000,
exp: 17114000,
iat: 17114000,
jti: 'c538d8f9-9144-40ea-9482-exampleJTI',
username: '0145dc99-d44e-4195-ae17-exampleSUB'
}
既然您提到您打算使用从托管 UI 发出的 JWT,我强烈建议使用 aws-jwt-verify 库。这样您就可以同时验证和解码 JWT。
如果您只是想解码令牌,您可以执行类似的操作:
import { decomposeUnverifiedJwt } from "aws-jwt-verify/jwt";
const { payload } = decomposeUnverifiedJwt(
"eyJraWQeyJhdF9oYXNoIjoidk..." // the JWT as string
);
console.log(payload);
这将产生示例响应:
{
sub: '0145dc99-d44e-4195-ae17-exampleSUB',
iss: 'https://cognito-idp.<region>.amazonaws.com/<user-pool-id>',
client_id: '7qfali14b8oq2rexampleAppClient',
origin_jti: '486b02b1-d9ad-4551-9fb8-exampleOriginJTI',
event_id: '40bc33fc-6582-40ed-b719-exampleEventID',
token_use: 'access',
scope: '<scopes>',
auth_time: 17114000,
exp: 17114000,
iat: 17114000,
jti: 'c538d8f9-9144-40ea-9482-exampleJTI',
username: '0145dc99-d44e-4195-ae17-exampleSUB'
}
再次强调,除非您绝对信任 JWT,否则您可以直接解码令牌,但我始终建议您先验证它。
这是另一个特定于 Express 的示例:https://github.com/awslabs/aws-jwt-verify?tab=readme-ov-file#express