本文介绍了如何在AWS Cognito身份验证流程中包含TOTP MFA的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

限时删除!!

我使用Cognito用户池来验证我的Web应用程序。我现在已经让它们都正常工作了,但是现在我需要为它启用MFA。我现在就是这样做的(所有提供的代码都是服务器端代码):

  1. 注册用户:
const cognito = new AWS.CognitoIdentityServiceProvider();
cognito.signUp({
    ClientId,
    Username: email,
    Password,
}).promise();
  1. 一封电子邮件将发送到用户的地址(在上一次函数调用中称为userName),其中包含一个代码。

  2. 用户读取代码并将代码提供给下一次函数调用:

cognito.confirmSignUp({
    ClientId,
    ConfirmationCode,
    Username: email,
    ForceAliasCreation: false,
}).promise();
  1. 用户登录:
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)。

  1. 注册用户:
const cognito = new AWS.CognitoIdentityServiceProvider();
cognito.signUp({
    ClientId,
    Username: email,
    Password,
}).promise();
  1. 一封电子邮件将发送到用户的地址(在上一次函数调用中称为userName),其中包含一个代码。

  2. 用户读取代码并将代码提供给下一次函数调用:

cognito.confirmSignUp({
    ClientId,
    ConfirmationCode: code,
    Username: email,
    ForceAliasCreation: false,
}).promise();
  1. 第一次登录:
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质询才能登录(每次用户注册都会发生一次)。

  1. 为用户启用TOTP MFA:
cognito.associateSoftwareToken({
  Session,
}).promise();

前一个调用是必需的,因为有两个选项,通过发出给定的调用,您告诉Cognito您希望您的用户启用TOTP MFA(而不是SMS MFA)。Session输入是上一次函数调用返回的输入。现在,这一次它将返回以下值:

{
  "SecretCode": "...",
  "Session": "..."
}
  1. 用户必须将给定的SecretCode输入到"Google Authenticator"之类的应用程序中。添加后,应用程序将开始显示一个6位数的数字,该数字每分钟刷新一次。

  2. 验证验证器应用:

cognito.verifySoftwareToken({
  UserCode: '123456',
  Session,
}).promise()

Session输入将是步骤5中返回的字符串,UserCode是目前验证器应用程序上显示的6位数字。如果成功完成此操作,您将获得以下返回值:

{
  "Status": "SUCCESS",
  "Session": "..."
}

我没有找到此对象返回的会话的任何用途。现在,注册过程已完成,用户可以登录。

  1. 实际登录(每次用户想要进行身份验证时都会发生):
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质询过程。

  1. 提供MFA:
  2. 完成登录过程
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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

1403页,肝出来的..

09-06 17:19