Meh*_*ran 2 amazon-cognito totp multi-factor-authentication
我正在使用 Cognito 用户池来验证我的 Web 应用程序。我现在一切正常,但现在我需要为它启用 MFA。这就是我现在的做法(提供的所有代码都是服务器端代码):
const cognito = new AWS.CognitoIdentityServiceProvider();
cognito.signUp({
ClientId,
Username: email,
Password,
}).promise();
Run Code Online (Sandbox Code Playgroud)
一封电子邮件被发送到用户的地址(在前面的函数调用中称为用户名),其中包含一个代码。
用户读取代码并将代码提供给下一个函数调用:
cognito.confirmSignUp({
ClientId,
ConfirmationCode,
Username: email,
ForceAliasCreation: false,
}).promise();
Run Code Online (Sandbox Code Playgroud)
const tokens = await cognito.adminInitiateAuth({
AuthFlow: 'ADMIN_NO_SRP_AUTH',
ClientId,
UserPoolId,
AuthParameters: {
'USERNAME': email,
'PASSWORD': password,
},
}).promise();
Run Code Online (Sandbox Code Playgroud)
我对这个过程很满意。但是现在我需要为此添加 TOTP MFA 功能。如果我想这样做,有人可以告诉我如何更改这些步骤吗?顺便说一句,我知道在创建用户池时需要为用户池启用 TOTP MFA。我只是询问它如何影响我的注册/登录过程。
好吧,我自己找到了一种方法来做到这一点。我必须说,我找不到任何关于此的文档,因此请自担风险使用它!
当然,这个过程假设您有一个启用了 MFA 的用户池(我使用了 TOTP MFA)。
const cognito = new AWS.CognitoIdentityServiceProvider();
cognito.signUp({
ClientId,
Username: email,
Password,
}).promise();
Run Code Online (Sandbox Code Playgroud)
一封电子邮件被发送到用户的地址(在前面的函数调用中称为用户名),其中包含一个代码。
用户读取代码并将代码提供给下一个函数调用:
cognito.confirmSignUp({
ClientId,
ConfirmationCode: code,
Username: email,
ForceAliasCreation: false,
}).promise();
Run Code Online (Sandbox Code Playgroud)
await cognito.adminInitiateAuth({
AuthFlow: 'ADMIN_NO_SRP_AUTH',
ClientId,
UserPoolId,
AuthParameters: {
'USERNAME': email,
'PASSWORD': password,
},
}).promise();
Run Code Online (Sandbox Code Playgroud)
此时,返回值将有所不同(与不强制执行 MFA 时您将获得的值相比)。返回值将类似于:
{
"ChallengeName": "MFA_SETUP",
"Session": "...",
"ChallengeParameters": {
"MFAS_CAN_SETUP": "[\"SOFTWARE_TOKEN_MFA\"]",
"USER_ID_FOR_SRP": "..."
}
}
Run Code Online (Sandbox Code Playgroud)
返回的对象表示用户MFA_SETUP在登录之前需要遵循质询(每次用户注册都会发生一次)。
{
"ChallengeName": "MFA_SETUP",
"Session": "...",
"ChallengeParameters": {
"MFAS_CAN_SETUP": "[\"SOFTWARE_TOKEN_MFA\"]",
"USER_ID_FOR_SRP": "..."
}
}
Run Code Online (Sandbox Code Playgroud)
需要上一个调用,因为有两个选项,通过发出给定调用,您告诉 Cognito 您希望您的用户启用 TOTP MFA(而不是 SMS MFA)。该Session输入是通过前面的函数调用的一个回报。现在,这一次它会返回这个值:
{
"SecretCode": "...",
"Session": "..."
}
Run Code Online (Sandbox Code Playgroud)
用户必须接受给定SecretCode并将其输入到“Google Authenticator”等应用程序中。添加后,该应用程序将开始显示每分钟刷新一次的 6 位数字。
验证身份验证器应用程序:
cognito.associateSoftwareToken({
Session,
}).promise();
Run Code Online (Sandbox Code Playgroud)
的Session输入将是串在步骤5返回,并且UserCode是在此刻的认证符的应用中所示的6位数字。如果成功完成,您将获得此返回值:
{
"Status": "SUCCESS",
"Session": "..."
}
Run Code Online (Sandbox Code Playgroud)
我没有发现这个对象返回的会话有任何用处。现在,注册过程完成,用户可以登录。
{
"SecretCode": "...",
"Session": "..."
}
Run Code Online (Sandbox Code Playgroud)
当然,这和第 4 步是一样的,但是它的返回值是不同的:
{
"ChallengeName": "SOFTWARE_TOKEN_MFA",
"Session": "...",
"ChallengeParameters": {
"USER_ID_FOR_SRP": "..."
}
}
Run Code Online (Sandbox Code Playgroud)
这告诉您,为了完成登录过程,您需要遵循SOFTWARE_TOKEN_MFA质询过程。
cognito.verifySoftwareToken({
UserCode: '123456',
Session,
}).promise()
Run Code Online (Sandbox Code Playgroud)
所述Session输入是通过步骤8返回的一个和mfa是6位需要从认证应用程序读取。调用该函数后,它将返回令牌:
{
"ChallengeParameters": {},
"AuthenticationResult": {
"AccessToken": "...",
"ExpiresIn": 3600,
"TokenType": "Bearer",
"RefreshToken": "...",
"IdToken": "..."
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2090 次 |
| 最近记录: |