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

React+Node/Express+AWS SDK应用MFA_SETUP挑战响应求助

React + Node/Express 集成Cognito强制MFA完整流程

以下是针对你的技术栈,实现强制MFA登录的完整步骤:

1. 处理MFA_SETUP挑战(后端逻辑)

当调用initiateAuth(使用AUTH_USER_PASSWORD_AUTH认证流程)后,Cognito返回ChallengeName: "MFA_SETUP"时,后端需执行以下操作:

  • 从返回结果中提取Session参数
  • 调用Cognito的associateSoftwareToken方法,传入Session,该方法会返回:
    • SecretCode:生成TOTP二维码的核心密钥
    • 新的Session:后续验证步骤的必备参数

后端代码示例(Node/Express + AWS SDK v2):

const AWS = require('aws-sdk');
const cognito = new AWS.CognitoIdentityServiceProvider({ region: '你的AWS区域' });

// 处理MFA_SETUP挑战,获取TOTP密钥
async function getMFASecret(session) {
  const params = { Session: session };
  const response = await cognito.associateSoftwareToken(params).promise();
  return {
    secretCode: response.SecretCode,
    session: response.Session
  };
}

2. 前端生成TOTP二维码

后端将secretCode和新Session返回前端后,前端生成可被MFA工具(如Google Authenticator)扫描的二维码:

  • 二维码内容格式:otpauth://totp/{用户池显示名称}:{用户名}?secret={secretCode}&issuer={用户池显示名称}
  • 使用前端库(如qrcode-react)生成二维码,展示给用户扫描

前端代码示例(React):

import QRCode from 'qrcode-react';
import { useState } from 'react';

function MFASetup({ secretCode, username, userPoolName, onVerify }) {
  const [code, setCode] = useState('');
  const qrContent = `otpauth://totp/${encodeURIComponent(userPoolName)}:${encodeURIComponent(username)}?secret=${secretCode}&issuer=${encodeURIComponent(userPoolName)}`;

  return (
    <div className="mfa-setup">
      <p>扫描下方二维码配置MFA</p>
      <QRCode value={qrContent} size={200} />
      <input
        type="text"
        placeholder="输入MFA验证码"
        value={code}
        onChange={(e) => setCode(e.target.value)}
        maxLength={6}
      />
      <button onClick={() => onVerify(code)}>验证并登录</button>
    </div>
  );
}

3. 验证MFA验证码并完成登录(后端逻辑)

用户扫描二维码后输入TOTP验证码,前端将验证码和Session发送给后端,后端调用respondToAuthChallenge完成验证:

  • ChallengeName指定为MFA_SETUP
  • ChallengeResponses需包含USERNAME和SOFTWARE_TOKEN_MFA_CODE(用户输入的验证码)
  • 传入最新的Session

后端代码示例:

// 验证MFA验证码,完成登录
async function verifyMFACode(session, username, code) {
  const params = {
    ChallengeName: 'MFA_SETUP',
    Session: session,
    ChallengeResponses: {
      USERNAME: username,
      SOFTWARE_TOKEN_MFA_CODE: code
    }
  };
  const response = await cognito.respondToAuthChallenge(params).promise();
  // 返回令牌给前端
  return {
    idToken: response.AuthenticationResult.IdToken,
    accessToken: response.AuthenticationResult.AccessToken,
    refreshToken: response.AuthenticationResult.RefreshToken
  };
}

4. 前端完成登录流程

后端验证通过后,将IdToken、AccessToken、RefreshToken返回前端,前端存储令牌(如localStorage),跳转至仪表盘即可。

关键说明

  • 你提到的缺少AccessToken是正常的:MFA设置属于登录流程的前置环节,此时尚未完成完整登录,无需AccessToken;associateSoftwareToken仅需initiateAuth返回的Session即可调用。
  • 用户后续登录时,Cognito会返回SOFTWARE_TOKEN_MFA挑战,此时只需调用respondToAuthChallenge传入验证码,无需重复配置二维码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 04:27:05