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

如何在JavaScript中获取Amazon Cognito当前登录用户信息

获取Amazon Cognito当前登录用户信息的方法

根据你的技术栈(JavaScript + Lambda + Cognito),可以从前端直接获取和后端Lambda中获取两种场景实现:

一、前端JavaScript直接获取

使用amazon-cognito-identity-js SDK,从本地存储中读取当前登录用户的会话和属性:

  1. 初始化用户池
  2. 获取当前登录用户实例
  3. 读取用户会话与属性
import { CognitoUserPool } from 'amazon-cognito-identity-js';

// 替换为你的Cognito配置
const poolConfig = {
  UserPoolId: 'us-east-1_XXXXXXXXX',
  ClientId: 'XXXXXXXXXXXXXXXXXXXXXXXXXX'
};

const userPool = new CognitoUserPool(poolConfig);
const currentUser = userPool.getCurrentUser();

if (currentUser) {
  // 获取用户会话(包含令牌)
  currentUser.getSession((err, session) => {
    if (err) {
      console.error('获取会话失败:', err);
      return;
    }
    
    // 从ID令牌解析用户基本信息(JWT格式,可直接解码)
    const idTokenPayload = session.getIdToken().decodePayload();
    console.log('用户基本信息:', idTokenPayload);
    
    // 获取完整用户属性
    currentUser.getUserAttributes((err, attributes) => {
      if (err) {
        console.error('获取用户属性失败:', err);
        return;
      }
      // 遍历输出所有属性
      const userAttrs = {};
      attributes.forEach(attr => {
        userAttrs[attr.getName()] = attr.getValue();
      });
      console.log('完整用户属性:', userAttrs);
    });
  });
} else {
  console.log('当前无登录用户');
}

说明:getCurrentUser()会自动读取Cognito存在localStorage中的登录状态,仅当用户已完成登录流程时有效。

二、后端Lambda中获取

前端调用Lambda时携带Cognito令牌,Lambda通过AWS SDK验证令牌并获取用户信息:

  1. 前端请求Lambda时,在请求头中加入Authorization: Bearer <AccessToken/IdToken>
  2. Lambda中验证令牌并调用Cognito API获取用户信息
const { CognitoIdentityServiceProvider } = require('aws-sdk');
const cognitoClient = new CognitoIdentityServiceProvider();

exports.handler = async (event) => {
  // 从请求头提取令牌
  const authHeader = event.headers?.Authorization;
  if (!authHeader || !authHeader.startsWith('Bearer ')) {
    return {
      statusCode: 401,
      body: JSON.stringify('请提供有效身份令牌')
    };
  }
  const accessToken = authHeader.split(' ')[1];

  try {
    // 调用Cognito API获取用户信息
    const userResponse = await cognitoClient.getUser({
      AccessToken: accessToken
    }).promise();
    
    // 处理并返回用户信息
    const userInfo = {
      username: userResponse.Username,
      attributes: userResponse.UserAttributes.reduce((acc, attr) => {
        acc[attr.Name] = attr.Value;
        return acc;
      }, {})
    };
    
    return {
      statusCode: 200,
      body: JSON.stringify(userInfo)
    };
  } catch (error) {
    console.error('验证令牌或获取用户信息失败:', error);
    return {
      statusCode: 401,
      body: JSON.stringify('令牌无效或已过期')
    };
  }
};

权限配置

确保Lambda执行角色拥有cognito-idp:GetUser权限,可在IAM角色的权限策略中添加:

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

注意事项

  • 令牌存在有效期,前端需处理令牌过期后的刷新逻辑(使用refreshToken调用refreshSession)
  • 后端优先使用Cognito官方API验证令牌,避免自行解码JWT时跳过签名验证导致安全问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:12:03