通过


教程:向 Android 应用添加电子邮件强身份验证方法注册

本教程演示如何使用本机身份验证在 Android 应用中实现电子邮件强身份验证方法注册。 已启用多重身份验证(MFA)的用户至少必须进行一个强身份验证。 目前,我们仅支持电子邮件和短信一次性密码作为强身份验证方法。

本教程中,您将学习如何:

  • 为已启用 MFA 的用户注册强身份验证方法。
  • 处理强身份验证方法注册错误。

先决条件

  1. 完成教程中的步骤 :使用本机身份验证在 Android 应用中添加登录

  2. 若要为客户强制实施 MFA,请使用向 应用添加 MFA 中的步骤将 Email OTP MFA 添加到登录流。 目前,本机身份验证支持电子邮件和短信一次性密码作为 MFA 的第二个因素。 因此,仅当身份验证方法是具有密码的电子邮件时,才会使用电子邮件 OTP 作为第二个因素。

  3. 如果想要浏览我们的强身份认证方法注册实现,请在入门之前查看 代码示例

将强身份验证方法注册添加到客户端配置文件

若要支持强身份验证方法,请更新 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 的用户注册强身份验证方法(电子邮件一次性密码),需要:

  1. 创建用户界面 (UI) 以:

    • 提醒用户:注册强身份验证方法是登录所需的步骤(可选)。
    • 收集要注册为强身份验证方法的电子邮件地址。 如果用户未提供电子邮件地址,将使用帐户创建期间提供的默认电子邮件地址。
    • 从用户收集通过电子邮件发送的一次性密码,以完成双重身份验证。
    • 重新发送一次性密码(推荐)。
  2. 处理 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,要求用户将备用电子邮件地址指定为强身份验证方法,或使用帐户创建期间提供的默认电子邮件地址。

  3. 处理 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() 方法,该方法可用于提交发送到用户邮箱的一次性验证码。

  4. 处理 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,指示用户已成功进行身份验证。

处理强身份验证方法注册错误

若要处理强身份验证方法注册期间发生的错误,可以使用以下代码片段:

  1. 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() 检查特定错误,例如输入的验证联系人无效。 在这种情况下,必须使用以前的状态引用来发送新的质询。

  2. 处理 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() 检查特定错误,例如提交的质询无效。 在这种情况下,必须使用先前的状态参考来重新提交挑战。

后续步骤