Bagikan melalui


Tutorial: Pengaturan ulang kata sandi mandiri di aplikasi iOS/macOS

Berlaku untuk: Lingkaran putih dengan simbol X abu-abu. Penyewa Tenaga Kerja Lingkaran hijau dengan simbol tanda centang putih. Penyewa Eksternal (pelajari lebih lanjut)

Tutorial ini menunjukkan cara memberi pengguna kemampuan untuk mengubah atau mengatur ulang kata sandi mereka, tanpa keterlibatan administrator atau staf dukungan.

Di tutorial ini, Anda akan:

  • Tambahkan pengaturan ulang kata sandi mandiri.
  • Tangani kesalahan.

Prasyarat

Atur ulang kata sandi

Untuk mengatur ulang kata sandi pengguna yang ada, kita perlu memvalidasi alamat email menggunakan kode sandi satu kali (OTP).

  1. Untuk memvalidasi email, kami memanggil metode resetPassword(parameters:delegate) dari instans SDK menggunakan cuplikan kode berikut:

    let parameters = MSALNativeAuthResetPasswordParameters(username: email)
    nativeAuth.resetPassword(parameters: parameters, delegate: self)
    
  2. Untuk menerapkan protokol ResetPasswordStartDelegate sebagai ekstensi ke kelas kami, gunakan cuplikan kode berikut:

    extension ViewController: ResetPasswordStartDelegate {
        func onResetPasswordCodeRequired(
            newState: MSAL.ResetPasswordCodeRequiredState,
            sentTo: String,
            channelTargetType: MSALNativeAuthChannelType,
            codeLength: Int
        ) {
            resultTextView.text = "Verification code sent to \(sentTo)"
        }
    
        func onResetPasswordStartError(error: MSAL.ResetPasswordStartError) {
            resultTextView.text = "Error verifying code: \(error.errorDescription ?? "no description")"
        }
    }
    

    Panggilan ke resetPassword(parameters:delegate) menghasilkan panggilan ke metode delegasi onResetPasswordCodeRequired() atau onResetPasswordStartError().

    Dalam skenario yang paling umum onResetPasswordCodeRequired(newState:sentTo:channelTargetType:codeLength) akan dipanggil untuk menunjukkan bahwa kode telah dikirim untuk memverifikasi alamat email pengguna. Bersama dengan beberapa rincian tentang di mana kode telah dikirim, dan berapa banyak digit yang terkandung di dalamnya, metode delegasi ini juga memiliki parameter newState jenis ResetPasswordCodeRequiredState, yang memberikan akses kepada kami ke dua metode baru.

    • submitCode(code:delegate)
    • resendCode(delegate)

    Untuk mengirimkan kode yang disediakan pengguna kepada kami, gunakan:

    newState.submitCode(code: userSuppliedCode, delegate: self)
    
  3. Untuk memverifikasi kode yang dikirimkan, mulailah dengan menerapkan protokol ResetPasswordVerifyCodeDelegate sebagai ekstensi ke kelas Anda menggunakan cuplikan kode berikut:

    extension ViewController: ResetPasswordVerifyCodeDelegate {
    
        func onResetPasswordVerifyCodeError(
            error: MSAL.VerifyCodeError,
            newState: MSAL.ResetPasswordCodeRequiredState?
        ) {
            resultTextView.text = "Error verifying code: \(error.errorDescription ?? "no description")"
        }
    
        func onPasswordRequired(newState: MSAL.ResetPasswordRequiredState) {
            // use newState instance to submit the new password
        }
    }
    

    Dalam skenario yang paling umum, kami menerima panggilan ke onPasswordRequired(newState) menunjukkan bahwa kami dapat memberikan kata sandi baru menggunakan instans newState.

    newState.submitPassword(password: newPassword, delegate: self)
    
  4. Untuk menerapkan protokol ResetPasswordRequiredDelegate sebagai ekstensi ke kelas kami, gunakan cuplikan kode berikut:

    extension ViewController: ResetPasswordRequiredDelegate {
    
        func onResetPasswordRequiredError(
            error: MSAL.PasswordRequiredError,
            newState: MSAL.ResetPasswordRequiredState?
        ) {
            resultTextView.text = "Error submitting new password: \(error.errorDescription ?? "no description")"
        }
    
        func onResetPasswordCompleted(newState: SignInAfterResetPasswordState) {
            resultTextView.text = "Password reset completed"
        }
    }
    

    Dalam skenario yang paling umum, kami menerima panggilan ke onResetPasswordCompleted(newState) menunjukkan bahwa alur reset kata sandi telah selesai.

Menangani kesalahan

Dalam penerapan protokol ResetPasswordStartDelegate sebelumnya, kami menampilkan kesalahan ketika kami menangani fungsi delegasi onResetPasswordStartError(error).

Kami dapat meningkatkan pengalaman pengguna dengan menangani jenis kesalahan tertentu sebagai berikut:

func onResetPasswordStartError(error: MSAL.ResetPasswordStartError) {
    if error.isInvalidUsername {
        resultTextView.text = "Invalid username"
    } else if error.isUserNotFound {
        resultTextView.text = "User not found"
    } else if error.isUserDoesNotHavePassword {
        resultTextView.text = "User is not registered with a password"
    } else {
        resultTextView.text = "Error during reset password flow in: \(error.errorDescription ?? "no description")"
    }
}

Menangani kesalahan dengan status

Beberapa kesalahan termasuk referensi ke negara baru. Misalnya, jika pengguna memasukkan kode verifikasi email yang salah, penanganan kesalahan menyertakan referensi ke ResetPasswordCodeRequiredState yang dapat digunakan untuk mengirimkan kode verifikasi baru.

Dalam implementasi protokol ResetPasswordVerifyCodeDelegate sebelumnya, kami hanya menampilkan kesalahan ketika kami menangani fungsi delegasi onResetPasswordError(error:newState).

Kami dapat meningkatkan pengalaman pengguna dengan meminta pengguna untuk memasukkan kode yang benar dan mengirimkannya kembali sebagai berikut:

func onResetPasswordVerifyCodeError(
    error: MSAL.VerifyCodeError,
    newState: MSAL.ResetPasswordCodeRequiredState?
) {
    if error.isInvalidCode {
        // Inform the user that the submitted code was incorrect and ask for a new code to be supplied.
        // Request a new code calling `newState.resendCode(delegate)`
        let userSuppliedCode = retrieveNewCode(newState)
        newState?.submitCode(code: userSuppliedCode, delegate: self)
    } else {
        resultTextView.text = "Error verifying code: \(error.errorDescription ?? "no description")"
    }
}

Contoh lain di mana handler kesalahan menyertakan referensi ke status baru adalah ketika pengguna memasukkan kata sandi yang tidak valid. Dalam hal ini, penanganan kesalahan menyertakan referensi ke ResetPasswordRequiredState yang dapat digunakan untuk mengirimkan kata sandi baru. Berikut adalah contohnya:

func onResetPasswordRequiredError(
    error: MSAL.PasswordRequiredError,
    newState: MSAL.ResetPasswordRequiredState?
) {
    if error.isInvalidPassword {
        // Inform the user that the submitted password was invalid and ask for a new password to be supplied.
        let newPassword = retrieveNewPassword()
        newState?.submitPassword(password: newPassword, delegate: self)
    } else {
        resultTextView.text = "Error submitting password: \(error.errorDescription ?? "no description")"
    }
}

Masuk setelah reset kata sandi

SDK memberi pengembang kemampuan untuk masuk ke pengguna setelah mengatur ulang kata sandi mereka tanpa harus menyediakan nama pengguna, atau untuk memverifikasi alamat email melalui kode sandi satu kali.

Untuk mendaftarkan pengguna setelah reset kata sandi berhasil, gunakan metode signIn(parameters:delegate) dari status baru SignInAfterResetPasswordState yang dikembalikan dalam fungsi onResetPasswordCompleted(newState):

extension ViewController: ResetPasswordRequiredDelegate {

    func onResetPasswordRequiredError(
        error: MSAL.PasswordRequiredError,
        newState: MSAL.ResetPasswordRequiredState?
    ) {
        resultTextView.text = "Error submitting new password: \(error.errorDescription ?? "no description")"
    }

    func onResetPasswordCompleted() {
        resultTextView.text = "Password reset completed"
        let parameters = MSALNativeAuthSignInAfterResetPasswordParameters()
        newState.signIn(parameters: parameters, delegate: self)
    }
}

signIn(parameters:delegate) menerima parameter delegasi dan kita harus menerapkan metode yang diperlukan dalam protokol SignInAfterResetPasswordDelegate.

Dalam skenario yang paling umum, kami menerima panggilan ke onSignInCompleted(result) menunjukkan bahwa pengguna telah masuk. Hasilnya dapat digunakan untuk mengakses access token.

extension ViewController: SignInAfterSignUpDelegate {
    func onSignInAfterSignUpError(error: SignInAfterSignUpError) {
        resultTextView.text = "Error signing in after password reset"
    }

    func onSignInCompleted(result: MSAL.MSALNativeAuthUserAccountResult) {
        // User successfully signed in
        let parameters = MSALNativeAuthGetAccessTokenParameters()
        result.getAccessToken(parameters: parameters, delegate: self)
    }
}

getAccessToken(parameters:delegate) menerima parameter delegasi dan kita harus menerapkan metode yang diperlukan dalam protokol CredentialsDelegate.

Dalam skenario yang paling umum, kami menerima panggilan ke onAccessTokenRetrieveCompleted(result) yang menunjukkan bahwa pengguna memperoleh access token.

extension ViewController: CredentialsDelegate {
    func onAccessTokenRetrieveError(error: MSAL.RetrieveAccessTokenError) {
        resultTextView.text = "Error retrieving access token"
    }

    func onAccessTokenRetrieveCompleted(result: MSALNativeAuthTokenResult) {
        resultTextView.text = "Signed in. Access Token: \(result.accessToken)"
    }
}

Langkah berikutnya