如何在JavaScript中获取Amazon Cognito当前登录用户信息
获取Amazon Cognito当前登录用户信息的方法
根据你的技术栈(JavaScript + Lambda + Cognito),可以从前端直接获取和后端Lambda中获取两种场景实现:
一、前端JavaScript直接获取
使用amazon-cognito-identity-js SDK,从本地存储中读取当前登录用户的会话和属性:
- 初始化用户池
- 获取当前登录用户实例
- 读取用户会话与属性
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验证令牌并获取用户信息:
- 前端请求Lambda时,在请求头中加入
Authorization: Bearer <AccessToken/IdToken> - 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
相关产品推荐
相关产品推荐

