关于如何在身份验证中实施质询(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 });
}
}
希望对某人有所帮助。如果您有更好的解决方案,请告诉我。
我正在尝试将 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 });
}
}
希望对某人有所帮助。如果您有更好的解决方案,请告诉我。