Amazon Cognito ID 解码

问题描述 投票:0回答:1

我正在构建一个 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 amazon-web-services jwt amazon-cognito
1个回答
0
投票

如果您使用 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

© www.soinside.com 2019 - 2024. All rights reserved.