教學課程:新增自助式密碼重設
本教學課程示範如何讓用戶變更或重設其密碼,而不需要系統管理員或技術支援中心介入。
在本教學課程中,您將瞭解如何:
- 新增自助式密碼重設 (SSPR) 流程。
- 將 SSPR 所需的使用者介面 (UI) 新增至您的應用程式。
- 處理錯誤。
先決條件
- 在範例原生 Android 行動應用程式中完成 登入使用者中的步驟,。 本文說明如何根據您的租用戶設定來執行您已配置的 Android 範例。
- 啟用自助式密碼重設。 本文可讓您為租使用者中的所有使用者啟用電子郵件一次性密碼驗證方法,這是 SSPR 的需求。
- 教學課程:準備Android應用程式以進行原生驗證。
新增自助式密碼重設流程
若要將 SSPR 流程新增至 Android 應用程式,您需要密碼重設使用者介面:
- 用於收集使用者電子郵件地址的輸入文字欄位。
- 用於收集一次性密碼的輸入欄位。
- 用來輸入新密碼的文字欄位。
當使用者忘記密碼時,他們需要一個窗體來輸入使用者名稱(電子郵件位址),以啟動密碼重設流程。 用戶選取 [忘記密碼] 按鈕或連結。
啟動密碼重設流程
若要在使用者選取 [忘記密碼 ] 按鈕或鏈接時處理要求,請使用 Android SDK 的 resetPassword(parameters)
方法,如下列代碼段所示:
private fun forgetPassword() {
CoroutineScope(Dispatchers.Main).launch {
val parameter = NativeAuthResetPasswordParameters(username = email)
val actionResult = authClient.resetPassword(parameter)
when (resetPasswordResult) {
is ResetPasswordStartResult.CodeRequired -> {
// The implementation of submiteCode() please see below.
submitCode(resetPasswordResult.nextState)
}
is ResetPasswordError -> {
// Handle errors
handleResetPasswordError(resetPasswordResult)
}
}
}
}
resetPassword(parameters)
方法會起始密碼重設流程,並將電子郵件一次性密碼傳送至使用者的電子郵件地址進行驗證。resetPassword(parameters)
傳回結果為ResetPasswordStartResult.CodeRequired
或ResetPasswordError
。如果符合
resetPasswordResult is ResetPasswordStartResult.CodeRequired
的條件,應用程式需要從使用者那裡收集電子郵件一次性密碼,並將其提交,如 提交電子郵件一次性密碼中所示。如果
resetPasswordResult is ResetPasswordError
,Android SDK 會提供公用程式方法,讓您進一步分析特定錯誤: -isUserNotFound()
-isBrowserRequired()
這些錯誤表示先前的作業失敗,因此無法使用新狀態的參考。 處理這些錯誤,如 處理錯誤 一節所示。
提交電子郵件一次性密碼
您的應用程式會從使用者收集電子郵件一次性密碼。 若要提交電子郵件一次性密碼,請使用下列代碼段:
private suspend fun submitCode(currentState: ResetPasswordCodeRequiredState) {
val code = binding.codeText.text.toString()
val submitCodeResult = currentState.submitCode(code)
when (submitCodeResult) {
is ResetPasswordSubmitCodeResult.PasswordRequired -> {
// Handle success
resetPassword(submitCodeResult.nextState)
}
is SubmitCodeError -> {
// Handle errors
handleSubmitCodeError(actionResult)
}
}
}
submitCode()
動作的傳回結果為ResetPasswordSubmitCodeResult.PasswordRequired
或SubmitCodeError
。如果
submitCodeResult is ResetPasswordSubmitCodeResult.PasswordRequired
應用程式需要向使用者收集並提交新密碼,如 中“提交新密碼”所示。如果使用者在電子郵件中未收到電子郵件一次性密碼,應用程式可以重新傳送電子郵件一次性密碼。 使用下列代碼段重新傳送新的電子郵件一次性密碼:
private fun resendCode() { clearCode() val currentState = ResetPasswordCodeRequiredState CoroutineScope(Dispatchers.Main).launch { val resendCodeResult = currentState.resendCode() when (resendCodeResult) { is ResetPasswordResendCodeResult.Success -> { // Handle code resent success } is ResendCodeError -> { // Handle ResendCodeError errors } } } }
resendCode()
動作的傳回結果為ResetPasswordResendCodeResult.Success
或ResendCodeError
。ResendCodeError
SDK 發生非預期的錯誤。 此錯誤表示先前的作業失敗,因此無法使用新狀態的參考。
如果
submitCodeResult is SubmitCodeError
,Android SDK 會提供公用程式方法,讓您進一步分析特定錯誤:isInvalidCode()
isBrowserRequired()
這些錯誤表示先前的作業失敗,因此無法使用新狀態的參考。 處理這些錯誤,如 處理錯誤 一節所示。
提交新密碼
驗證使用者的電子郵件之後,您必須從使用者收集新密碼並提交。 應用程式從使用者收集的密碼必須符合 Microsoft Entra 的密碼原則。 使用下列代碼段:
private suspend fun resetPassword(currentState: ResetPasswordPasswordRequiredState) {
val password = binding.passwordText.text.toString()
val submitPasswordResult = currentState.submitPassword(password)
when (submitPasswordResult) {
is ResetPasswordResult.Complete -> {
// Handle reset password complete.
}
is ResetPasswordSubmitPasswordError -> {
// Handle errors
handleSubmitPasswordError(actionResult)
}
}
}
submitPassword()
動作的傳回結果為ResetPasswordResult.Complete
或ResetPasswordSubmitPasswordError
。ResetPasswordResult.Complete
表示密碼重設流程成功。如果
submitPasswordResult is ResetPasswordSubmitPasswordError
,SDK 會提供公用程式方法來進一步分析傳回的特定錯誤類型: -isInvalidPassword()
-isPasswordResetFailed()
這些錯誤表示先前的作業失敗,因此無法使用新狀態的參考。 處理這些錯誤,如 處理錯誤 一節所示。
密碼重設後自動登入
成功密碼重設流程之後,您可以自動登入使用者,而不需要起始全新的登入流程。
ResetPasswordResult.Complete
會傳回 SignInContinuationState
物件。
SignInContinuationState
可讓您存取 signIn(parameters)
方法。
若要在密碼重設之後自動登入使用者,請使用下列代碼段:
private suspend fun resetPassword(currentState: ResetPasswordPasswordRequiredState) {
val submitPasswordResult = currentState.submitPassword(password)
when (submitPasswordResult) {
is ResetPasswordResult.Complete -> {
signInAfterPasswordReset(nextState = actionResult.nextState)
}
}
}
private suspend fun signInAfterPasswordReset(nextState: SignInContinuationState) {
val signInContinuationState = nextState
val parameters = NativeAuthSignInContinuationParameters()
val signInActionResult = signInContinuationState.signIn(parameters)
when (actionResult) {
is SignInResult.Complete -> {
fetchTokens(accountState = actionResult.resultValue)
}
else {
// Handle unexpected error
}
}
}
private suspend fun fetchTokens(accountState: AccountState) {
val getAccessTokenParameters = NativeAuthGetAccessTokenParameters()
val accessTokenResult = accountState.getAccessToken(getAccessTokenParameters)
if (accessTokenResult is GetAccessTokenResult.Complete) {
val accessToken = accessTokenResult.resultValue.accessToken
val idToken = accountState.getIdToken()
}
}
若要在登入之後擷取識別碼令牌宣告,請使用 讀取識別碼令牌宣告中的步驟。
處理密碼重設錯誤
可能會發生一些預期的錯誤。 例如,使用者可能會嘗試使用不存在的電子郵件重設密碼,或提供不符合密碼需求的密碼。
發生錯誤時,請向使用者提供錯誤提示。
這些錯誤可能發生在密碼重設流程開始時,或在提交電子郵件一次性密碼或提交密碼時發生。
處理啟動密碼重設錯誤
若要處理啟動密碼重設所造成的錯誤,請使用下列代碼段:
private fun handleResetPasswordError(error: ResetPasswordError) {
when {
error.isUserNotFound() -> {
// Display error
}
else -> {
// Unexpected error
}
}
}
處理提交電子郵件一次性密碼錯誤
若要處理提交電子郵件一次性密碼所造成的錯誤,請使用下列程式碼片段:
private fun handleSubmitCodeError(error: SubmitCodeError) {
when {
error.isInvalidCode() -> {
// Display error
}
else -> {
// Unexpected error
}
}
}
處理送出密碼錯誤
若要處理提交密碼所造成的錯誤,請使用下列代碼段:
private fun handleSubmitPasswordError(error: ResetPasswordSubmitPasswordError) {
when {
error.isInvalidPassword() || error.isPasswordResetFailed()
-> {
// Display error
}
else -> {
// Unexpected error
}
}
}