问题描述
我使用Cognito用户池来验证我的Web应用程序。我现在已经让它们都正常工作了,但是现在我需要为它启用MFA。我现在就是这样做的(所有提供的代码都是服务器端代码):
- 注册用户:
const cognito = new AWS.CognitoIdentityServiceProvider();
cognito.signUp({
ClientId,
Username: email,
Password,
}).promise();
一封电子邮件将发送到用户的地址(在上一次函数调用中称为userName),其中包含一个代码。
用户读取代码并将代码提供给下一次函数调用:
cognito.confirmSignUp({
ClientId,
ConfirmationCode,
Username: email,
ForceAliasCreation: false,
}).promise();
- 用户登录:
const tokens = await cognito.adminInitiateAuth({
AuthFlow: 'ADMIN_NO_SRP_AUTH',
ClientId,
UserPoolId,
AuthParameters: {
'USERNAME': email,
'PASSWORD': password,
},
}).promise();
我对这个过程非常满意。但是现在我需要将TOTP MFA功能添加到其中。谁能告诉我,如果我想这样做,这些步骤将如何改变?顺便说一句,我知道在创建用户池时需要为其启用TOTP MFA。我只是想问一下它对我的注册/登录过程有什么影响。
推荐答案
好的,我自己找到了一种方法。我必须说,我找不到任何关于这方面的文件,所以使用它的风险自负!
当然,此过程假设您的用户池启用了MFA(我使用的是TOTP MFA)。
- 注册用户:
const cognito = new AWS.CognitoIdentityServiceProvider();
cognito.signUp({
ClientId,
Username: email,
Password,
}).promise();
一封电子邮件将发送到用户的地址(在上一次函数调用中称为userName),其中包含一个代码。
用户读取代码并将代码提供给下一次函数调用:
cognito.confirmSignUp({
ClientId,
ConfirmationCode: code,
Username: email,
ForceAliasCreation: false,
}).promise();
- 第一次登录:
await cognito.adminInitiateAuth({
AuthFlow: 'ADMIN_NO_SRP_AUTH',
ClientId,
UserPoolId,
AuthParameters: {
'USERNAME': email,
'PASSWORD': password,
},
}).promise();
此时,返回值将有所不同(与未强制执行MFA时得到的值相比)。返回值如下所示:
{
"ChallengeName": "MFA_SETUP",
"Session": "...",
"ChallengeParameters": {
"MFAS_CAN_SETUP": "["SOFTWARE_TOKEN_MFA"]",
"USER_ID_FOR_SRP": "..."
}
}
返回的对象表示用户需要遵循MFA_SETUP
质询才能登录(每次用户注册都会发生一次)。
- 为用户启用TOTP MFA:
cognito.associateSoftwareToken({
Session,
}).promise();
前一个调用是必需的,因为有两个选项,通过发出给定的调用,您告诉Cognito您希望您的用户启用TOTP MFA(而不是SMS MFA)。Session
输入是上一次函数调用返回的输入。现在,这一次它将返回以下值:
{
"SecretCode": "...",
"Session": "..."
}
用户必须将给定的
SecretCode
输入到"Google Authenticator"之类的应用程序中。添加后,应用程序将开始显示一个6位数的数字,该数字每分钟刷新一次。验证验证器应用:
cognito.verifySoftwareToken({
UserCode: '123456',
Session,
}).promise()
Session
输入将是步骤5中返回的字符串,UserCode
是目前验证器应用程序上显示的6位数字。如果成功完成此操作,您将获得以下返回值:
{
"Status": "SUCCESS",
"Session": "..."
}
我没有找到此对象返回的会话的任何用途。现在,注册过程已完成,用户可以登录。
- 实际登录(每次用户想要进行身份验证时都会发生):
await cognito.adminInitiateAuth({
AuthFlow: 'ADMIN_NO_SRP_AUTH',
ClientId,
UserPoolId,
AuthParameters: {
'USERNAME': email,
'PASSWORD': password,
},
}).promise();
当然,这与步骤4相同,但其返回值不同:
{
"ChallengeName": "SOFTWARE_TOKEN_MFA",
"Session": "...",
"ChallengeParameters": {
"USER_ID_FOR_SRP": "..."
}
}
这是在告诉您,为了完成登录过程,您需要遵循SOFTWARE_TOKEN_MFA
质询过程。
- 提供MFA: 完成登录过程
cognito.adminRespondToAuthChallenge({
ChallengeName: "SOFTWARE_TOKEN_MFA",
ClientId,
UserPoolId,
ChallengeResponses: {
"USERNAME": config.username,
"SOFTWARE_TOKEN_MFA_CODE": mfa,
},
Session,
}).promise()
Session
输入是步骤8返回的输入,mfa
是需要从验证器应用程序读取的6位数字。调用该函数后,它将返回令牌:{
"ChallengeParameters": {},
"AuthenticationResult": {
"AccessToken": "...",
"ExpiresIn": 3600,
"TokenType": "Bearer",
"RefreshToken": "...",
"IdToken": "..."
}
}
这篇关于如何在AWS Cognito身份验证流程中包含TOTP MFA的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!