本教程演示如何使用本机身份验证在 Android 应用中实现电子邮件强身份验证方法注册。 已启用多重身份验证(MFA)的用户至少必须进行一个强身份验证。 目前,我们仅支持电子邮件和短信一次性密码作为强身份验证方法。
本教程中,您将学习如何:
- 为已启用 MFA 的用户注册强身份验证方法。
- 处理强身份验证方法注册错误。
先决条件
完成教程中的步骤 :使用本机身份验证在 Android 应用中添加登录。
若要为客户强制实施 MFA,请使用向 应用添加 MFA 中的步骤将 Email OTP MFA 添加到登录流。 目前,本机身份验证支持电子邮件和短信一次性密码作为 MFA 的第二个因素。 因此,仅当身份验证方法是具有密码的电子邮件时,才会使用电子邮件 OTP 作为第二个因素。
如果想要浏览我们的强身份认证方法注册实现,请在入门之前查看 代码示例。
将强身份验证方法注册添加到客户端配置文件
若要支持强身份验证方法,请更新 Android 客户端配置以包含所需的注册功能。
{
"client_id": "Enter_the_Application_Id_Here",
"authorities": [
{
"type": "CIAM",
"authority_url": "https://Enter_the_Tenant_Subdomain_Here.ciamlogin.com/Enter_the_Tenant_Subdomain_Here.onmicrosoft.com/"
}
],
"challenge_types": ["oob", "password"],
"capabilities": ["registration_required"],
"logging": {
"pii_enabled": false,
"log_level": "INFO",
"logcat_enabled": true
}
}
将电子邮件一次性密码注册为强身份验证方法
若要为启用了 MFA 的用户注册电子邮件一次性密码,可以使用帐户创建期间提供的默认电子邮件地址,或将备用电子邮件地址指定为强身份验证方法。 此过程仅在首次需要 MFA 时触发,并且用户没有注册强身份验证方法。 之后,需要发送一封电子邮件,其中包含一次性密码,供用户验证其电子邮件地址。 用户输入有效的一次性密码后,应用将完成登录过程。
若要为启用了 MFA 的用户注册强身份验证方法(电子邮件一次性密码),需要:
创建用户界面 (UI) 以:
- 提醒用户:注册强身份验证方法是登录所需的步骤(可选)。
- 收集要注册为强身份验证方法的电子邮件地址。 如果用户未提供电子邮件地址,将使用帐户创建期间提供的默认电子邮件地址。
- 从用户收集通过电子邮件发送的一次性密码,以完成双重身份验证。
- 重新发送一次性密码(推荐)。
处理
StrongAuthMethodRegistrationRequired登录结果:val parameters = NativeAuthSignInParameters(username = email) parameters.password = password val signInResult: SignInResult = authClient.signIn(parameters) when (actionResult) { // Handle "strong authentication method registration required" result is SignInResult.StrongAuthMethodRegistrationRequired -> { val authMethod = actionResult.authMethods.first {it.challengeChannel.uppercase() == "EMAIL"} // Next Step: challengeAuthMethod using nextState } }登录时,如果需要 MFA 且未注册强身份验证,系统将返回
SignInResult.StrongAuthMethodRegistrationRequired,要求用户将备用电子邮件地址指定为强身份验证方法,或使用帐户创建期间提供的默认电子邮件地址。处理
challengeAuthMethod()结果:val registerStrongAuthState = signInResult.nextState verificationContact = "user@contoso.com" // Do NOT hard-code email in production. Use the email provided during account creation or prompt the user for input. val params = NativeAuthChallengeAuthMethodParameters(authMethod, verificationContact = verificationContact) val challengeAuthResult = registerStrongAuthState.challengeAuthMethod(params) when (challengeAuthResult) { is RegisterStrongAuthChallengeResult.VerificationRequired -> { // Next Step: submitChallenge using nextState } is RegisterStrongAuthChallengeError -> { // Handle "register strong auth challenge" error } else -> { // Handle unexpected result } }该方法
challengeAuthMethod()向指定的verificationContact电子邮件地址发送一次性密码。 在最常见的方案中challengeAuthMethod(),返回一个结果,该结果RegisterStrongAuthChallengeResult.VerificationRequired指示 SDK 要求应用提交发送到电子邮件地址的电子邮件一次性密码。 对象RegisterStrongAuthChallengeResult.VerificationRequired包含一个新的状态引用,可以通过challengeAuthResult.nextState检索。 新状态允许你访问submitChallenge()方法,该方法可用于提交发送到用户邮箱的一次性验证码。处理
submitChallenge()结果:val registerStrongAuthVerificationRequiredState = challengeAuthResult.nextState val submitChallengeResult = registerStrongAuthVerificationRequiredState.submitChallenge(emailCode) when (actionResult) { is SignInResult.Complete -> { // Handle sign in success } is RegisterStrongAuthSubmitChallengeError -> { // Handle "register strong auth submit challenge" error } else -> { // Handle unexpected result } }在最常见的方案中,
submitChallenge()返回结果SignInResult.Complete,指示用户已成功进行身份验证。
处理强身份验证方法注册错误
若要处理强身份验证方法注册期间发生的错误,可以使用以下代码片段:
为
challengeAuthMethod()方法处理错误:val challengeAuthResult = registerStrongAuthState.challengeAuthMethod(params) if (challengeAuthResult is RegisterStrongAuthChallengeResult.VerificationRequired) { // Next Step: submit challenge } else if (challengeAuthResult is RegisterStrongAuthChallengeError) { // Handle errors under RegisterStrongAuthChallengeError when { error.isInvalidInput() -> { // Display error } else -> { // Unexpected error } } }注册质询后将使用
RegisterStrongAuthChallengeError方法处理registerStrongAuthState.challengeAuthMethod()。 使用该方法isInvalidInput()检查特定错误,例如输入的验证联系人无效。 在这种情况下,必须使用以前的状态引用来发送新的质询。处理
submitChallenge()方法的错误:val submitChallengeResult = registerStrongAuthVerificationRequiredState.submitChallenge(challenge = emailCode) if (submitChallengeResult is SignInResult.Complete) { // Handle sign in success } else if (submitChallengeResult is RegisterStrongAuthSubmitChallengeError) { // Handle errors under RegisterStrongAuthSubmitChallengeError when { error.isInvalidChallenge() -> { // Display error } else -> { // Unexpected error } } }使用
registerStrongAuthVerificationRequiredState.submitChallenge(challenge = emailCode)提交质询后,RegisterStrongAuthSubmitChallengeError将处理该质询。 使用该方法isInvalidChallenge()检查特定错误,例如提交的质询无效。 在这种情况下,必须使用先前的状态参考来重新提交挑战。