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

基于Astro.js与AWS Cognito的多用户登录问题及代码改造

修复AWS Cognito多用户登录问题

原代码的核心问题在于newPasswordRequired回调里硬编码了固定的用户属性和新密码,这只适配你最初创建的那个特定用户。当其他管理员创建的用户首次登录时,代码会强制用这些固定值去完成密码重置,和用户的实际信息不匹配,导致登录失败。

要支持多用户登录,需要把硬编码的逻辑改成动态收集用户输入的形式——让用户自己输入新密码和所需属性,而不是用固定值。以下是修改后的代码:

import { CognitoUserPool, CognitoUser, AuthenticationDetails } from 'amazon-cognito-identity-js';

// Configure Cognito
const poolData = {
    UserPoolId: 'xyz', // 替换为你的UserPoolId
    ClientId: 'xyz',   // 替换为你的ClientId
};

const userPool = new CognitoUserPool(poolData);
let sessionUserAttributes;

// Function to sign in
export const signIn = (username, password) => {
    const authenticationData = {
        Username: username,
        Password: password,
    };

    const authenticationDetails = new AuthenticationDetails(authenticationData);

    const userData = {
        Username: username,
        Pool: userPool,
    };

    const cognitoUser = new CognitoUser(userData);

    cognitoUser.authenticateUser(authenticationDetails, {
        onSuccess: (session) => {
            console.log('Authentication successful');
            // 登录成功后的逻辑,比如跳转到主页
            window.location.href = '/dashboard'; // 替换为你的目标页面
        },
        onFailure: (err) => {
            console.error('Authentication failed:', err);
            // 给用户展示错误提示,比如用户名/密码错误、用户未验证等
            alert(`登录失败: ${err.message || '未知错误'}`);
        },
        newPasswordRequired: (userAttributes, requiredAttributes) => {
            // 移除Cognito不允许回传的属性
            delete userAttributes.email_verified;
            delete userAttributes.email;

            // 保存用户属性到全局变量
            sessionUserAttributes = userAttributes;

            // 这里需要触发前端UI,让用户输入新密码和必填属性
            // 示例:用prompt收集(实际项目建议用模态框表单)
            const newPassword = prompt('请设置新密码:');
            if (!newPassword) return;

            // 根据requiredAttributes收集必填属性,这里示例假设需要given_name、family_name、phone_number
            const givenName = prompt('请输入你的名字:');
            const familyName = prompt('请输入你的姓氏:');
            const phoneNumber = prompt('请输入你的手机号:');

            // 更新用户属性
            sessionUserAttributes.given_name = givenName;
            sessionUserAttributes.family_name = familyName;
            sessionUserAttributes.phone_number = phoneNumber;

            // 完成新密码挑战
            cognitoUser.completeNewPasswordChallenge(newPassword, sessionUserAttributes, {
                onSuccess: (session) => {
                    console.log('密码重置成功,登录完成');
                    window.location.href = '/dashboard';
                },
                onFailure: (err) => {
                    console.error('密码重置失败:', err);
                    alert(`密码重置失败: ${err.message}`);
                }
            });
        },
    });
};

关键修改说明

  • 移除硬编码:不再固定用户属性和新密码,改为让用户自行输入,适配所有管理员创建的用户。
  • 错误提示优化:在onFailure里添加用户可见的错误提示,方便排查问题(比如用户未验证、密码复杂度不符合要求等)。
  • 登录成功跳转:把原来的window.location.reload()改成跳转到目标页面,更符合实际应用逻辑。
  • UI优化建议:实际项目中不要用prompt,建议用模态框表单收集用户输入,提升体验。

额外注意事项

  1. 确保新添加的Cognito用户状态是已验证(邮箱或电话验证通过),未验证的用户无法登录。
  2. 如果用户是自行注册的(不是管理员创建),不会触发newPasswordRequired回调,代码可以正常处理登录。
  3. 检查Cognito用户池的密码策略,确保用户设置的新密码符合要求(比如长度、包含特殊字符等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 17:50:31