You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Lambda中通过Cognito ID获取用户自定义时区属性?

能否通过Cognito ID在Lambda中获取用户自定义属性?

当然可以!只要你有用户的Cognito ID(通常是用户池里的sub属性值),就能在Lambda中通过AWS SDK调用Cognito的API获取到关联的自定义属性,包括你需要的时区。下面是具体的实现步骤和代码示例:

1. 给Lambda配置必要的IAM权限

Lambda需要具备访问Cognito用户池的权限才能调用用户属性查询接口。你需要给Lambda的执行角色附加以下IAM策略(替换其中的区域、账号ID和用户池ID):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "cognito-idp:AdminGetUser",
      "Resource": "arn:aws:cognito-idp:你的AWS区域:你的AWS账号ID:userpool/你的Cognito用户池ID"
    }
  ]
}

这里用AdminGetUser是因为它属于管理员级别的操作,不需要用户的访问令牌,仅通过用户池ID和用户ID(sub)就能查询属性,非常适合后端Lambda场景。

2. 在Lambda中编写代码获取用户属性

以Node.js为例,使用AWS SDK v3实现查询逻辑:

import { CognitoIdentityProviderClient, AdminGetUserCommand } from "@aws-sdk/client-cognito-identity-provider";

// 初始化Cognito客户端
const cognitoClient = new CognitoIdentityProviderClient({ region: "你的AWS区域" });

export const handler = async (event) => {
  // 从事件参数中获取用户的Cognito ID(sub)和用户池ID
  const { cognitoUserId, userPoolId } = event;

  try {
    // 构造查询命令
    const getUserCommand = new AdminGetUserCommand({
      UserPoolId: userPoolId,
      Username: cognitoUserId // 这里直接传入用户的Cognito ID(sub)
    });

    // 调用Cognito API获取用户信息
    const userResponse = await cognitoClient.send(getUserCommand);

    // 从返回结果中提取自定义时区属性
    const timezoneAttr = userResponse.UserAttributes.find(attr => attr.Name === "custom:timezone");
    
    if (timezoneAttr) {
      const userTimezone = timezoneAttr.Value;
      console.log("获取到用户时区:", userTimezone);

      // 示例:将Unix时间戳转换为用户本地时间
      const unixTimestamp = 1699996800; // 示例时间戳(秒级)
      const userLocalTime = new Date(unixTimestamp * 1000).toLocaleString("zh-CN", {
        timeZone: userTimezone,
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit'
      });
      console.log("转换后的用户本地时间:", userLocalTime);

      return {
        statusCode: 200,
        body: JSON.stringify({
          success: true,
          timezone: userTimezone,
          localTime: userLocalTime
        })
      };
    } else {
      console.log("用户未设置时区属性");
      return {
        statusCode: 200,
        body: JSON.stringify({
          success: false,
          message: "用户未设置时区"
        })
      };
    }
  } catch (error) {
    console.error("获取用户属性失败:", error);
    return {
      statusCode: 500,
      body: JSON.stringify({
        success: false,
        error: "无法获取用户属性,请检查权限和用户ID是否正确"
      })
    };
  }
};

关键注意事项

  • 确保你的Cognito用户池已经启用了custom:timezone这个自定义属性,并且用户已经通过注册流程或管理后台设置了该属性的值。
  • 如果你的Lambda是通过前端传递的用户访问令牌触发的,也可以使用GetUser接口(不需要管理员权限),但此时需要传入用户的访问令牌而非Cognito ID。

内容的提问来源于stack exchange,提问作者WeCanBeFriends

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:06:54