我们有一个应用程序,使用Cognito来验证用户和处理MFA。我们还使用CUSTOM_AUTH流,因为我们需要将CUSTOM_CHALLENGE与defineauth、createauth和verifyauth lambdas一起使用,这些lambdas允许我们处理Cognito不支持的电子邮件MFA。
现在我需要实现额外的MFA来执行应用程序中的一些操作,我有点卡住了。我们的想法是只触发其中一个MFA挑战(取决于用户配置的内容),并使用CUSTOM_CHALLENGE应用一些其他安全控制,但我无法让Cognito在CUSTOM_AUTH中触发其任何MFA挑战。
为了简化,假设我们只有以下createauth lambda函数:
def lambda_handler(event, context):
print("received event:", event)
process_event(event)
print("response event:", event)
return event
def process_event(event):
if len(event["request"]["session"]) == 0:
event["response"]["issueTokens"] = False
event["response"]["failAuthentication"] = False
event["response"]["challengeName"] = "SOFTWARE_TOKEN_MFA"
return
s = event["request"]["session"][len(event["request"]["session"]) - 1]
if s["challengeName"] == "SOFTWARE_TOKEN_MFA" and s["challengeResult"]:
event["response"]["issueTokens"] = True
event["response"]["failAuthentication"] = False
return
event["response"]["issueTokens"] = False
event["response"]["failAuthentication"] = True
基本上,它假设用户
SOFTWARE_TOKEN_MFA
已启用(仅用于测试)并发送
软件_打开_ MFA
挑战作为流程中的第一个挑战。然后,它检查是否通过了验证,并向用户发出访问令牌。
当我开始身份验证时:
aws cognito-idp initiate-auth --auth-flow CUSTOM_AUTH \
--client-id <client-id> \
--region ap-southeast-2 \
--auth-parameters 'USERNAME=<username>'
一切如预期:
{
"ChallengeName": "SOFTWARE_TOKEN_MFA",
"Session": "<session>",
"ChallengeParameters": {
"USERNAME": "<user-id>"
}
}
但是,当我提供有效代码时(我可以证明它是有效的,因为我已经以“正常方式”为此用户配置了MFA,并且可以使用验证器应用程序代码登录):
aws cognito-idp respond-to-auth-challenge
--client-id <client-id>
--region ap-southeast-2
--challenge-name SOFTWARE_TOKEN_MFA
--challenge-responses 'USERNAME=<user-id>,SOFTWARE_TOKEN_MFA_CODE=612345'
--session <session>
我收到以下错误:
An error occurred (CodeMismatchException) when calling the RespondToAuthChallenge operation: Invalid code or auth state for the user.
所以,基本上我的问题是:是否有可能从CUSTOM_AUTH流触发任何MFA挑战?如果有,我如何在不询问用户密码的情况下完成?
我在谷歌上搜索过,试图在stackoverflow上找到它,和chat gpt聊过,但没有找到答案。如果你对此事有任何了解,我将不胜感激。