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_SETUPChallengeResponses需包含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
相关产品推荐
相关产品推荐

