关于如何在身份验证中实施质询(2 因素身份验证等)的任何建议

Any suggestions on how to implement challenge (2 factor authentication, etc...) in authentication

我正在尝试将 2FA 合并到 React 管理员登录流程中。

问题是验证登录的标准方法是使用 useLogin。

const login = useLogin();

try {
  await login({username: "joeblack", password: "mybadpassword"}, "/redirectlocation");
} catch (err) {
  // display an error notice or whatever
}

基本上,useLogin 的登录函数要么完成登录过程并让用户登录,要么显示错误。

第二个身份验证步骤

对于 2FA、需要新密码等,需要有一个中间步骤,用户尚未通过身份验证才能查看资源,但不处于错误状态。

例如,登录可能 return 挑战类型。

从技术上讲,这可以通过 return 在 authProvider 登录功能中输入该信息然后根据该信息做出决定来完成。

const loginResult = login({username: "joeblack", password: "mybadpassword"});

// loginResult returns { challenge: "2FA" }

if (challenge) {
  // redirect to challenge page
} else {
  // redirect to dashboard or wherever
}

问题是,即使我们在登录功能之后处理它,一旦登录功能运行,从技术上讲,用户就会通过身份验证。这样他们就可以绕过挑战,直接输入他们想要的资源就可以查看了。

authProvider 的登录函数只有 2 个结果,一个 resolved promise 或 rejected promise。

在我进一步弄清楚如何完成这项工作之前,我想看看是否有其他人研究过这个问题。

这基本上是一种解决方法,但我认为这是目前最好的选择(尽管我希望被证明是错误的)。

想法是,即使 Amplify 的身份验证返回包含 Cognito 用户的已解决承诺,我们也会检查是否存在挑战 属性。如果有,那么我们拒绝登录承诺,因此 react-admin 不会让用户登录。

然后我们 return 被拒绝的承诺中的错误消息可以被调用登录函数的任何人读取。如果这是一个挑战,那么登录界面可以适当地处理它,并显示一个 2FA 屏幕进行确认。

在我们的案例中还必须包括 Cognito 用户,因为我们需要它来确认 2FA。

这里是authProvider登录函数

login: async ({ username, password }) => {
    try {
      const cognitoUser = await Auth.signIn(username, password);
      if (cognitoUser.hasOwnProperty("challengeName")) {
        return Promise.reject({
          message: cognitoUser.challengeName,
          cognitoUser: cognitoUser,
        });
      } else {
        return { ...createUser(cognitoUser) };
      }
    } catch (err) {
      return Promise.reject({ message: err.code });
    }
  }

希望对某人有所帮助。如果您有更好的解决方案,请告诉我。