Bagikan melalui


Tutorial: Menambahkan pendaftaran di aplikasi iOS/macOS menggunakan autentikasi asli

Berlaku untuk: Lingkaran hijau dengan simbol tanda centang putih. iOS (Swift) Lingkaran hijau dengan simbol tanda centang putih. macOS (Swift)

Tutorial ini menunjukkan cara mendaftarkan pengguna menggunakan kode sandi satu kali email atau nama pengguna (email) dan kata sandi, dan mengumpulkan atribut pengguna di aplikasi iOS/macOS Anda menggunakan autentikasi asli.

  • Daftarkan pengguna dengan menggunakan kode akses satu kali email atau nama pengguna (email) dan kata sandi.
  • Kumpulkan atribut pengguna selama pendaftaran.
  • Menangani kesalahan pendaftaran.

Prasyarat

Mendaftarkan pengguna

Untuk mendaftarkan pengguna menggunakan kode akses satu kali email atau nama pengguna (email) dan kata sandi, Anda mengumpulkan email dari pengguna, lalu mengirim email yang berisi kode sandi satu kali email kepada pengguna. Pengguna memasukkan kode akses satu kali email yang valid untuk memvalidasi nama pengguna mereka.

Untuk mendaftarkan pengguna, Anda perlu:

  1. Buat antarmuka pengguna (UI) untuk:

    • Kumpulkan email dari pengguna. Tambahkan validasi ke input Anda untuk memastikan pengguna memasukkan alamat email yang valid.
    • Kumpulkan kata sandi jika Anda mendaftar dengan nama pengguna (email) dan kata sandi.
    • Kumpulkan kode akses satu kali email dari pengguna.
    • Jika diperlukan, kumpulkan atribut pengguna.
    • Kirim ulang kode akses satu kali jika pengguna tidak menerimanya.
    • Mulai alur pendaftaran.
  2. Di aplikasi Anda, tambahkan tombol, yang peristiwa pemilihannya memicu cuplikan kode berikut:

    @IBAction func signUpPressed(_: Any) {
        guard let email = emailTextField.text else {
            resultTextView.text = "Email or password not set"
            return
        }
    
        nativeAuth.signUp(username: email, delegate: self)
    }
    
    • Untuk mendaftarkan pengguna menggunakan Kode akses satu kali email, kami menggunakan metode pustaka signUp(username:delegate) , yang merespons secara asinkron dengan memanggil salah satu metode pada objek delegasi yang diteruskan, yang harus menerapkan SignUpStartDelegate protokol. Baris kode berikut memulai proses pendaftaran pengguna:

      nativeAuth.signUp(username: email, delegate: self)
      

      Dalam metode ini signUp(username:delegate) , kami meneruskan alamat email pengguna dari formulir pengiriman dan delegasi (kelas yang mengimplementasikan SignUpStartDelegate protokol).

    • Untuk mendaftarkan pengguna menggunakan Email dengan kata sandi, gunakan cuplikan kode berikut:

      @IBAction func signUpPressed(_: Any) {
          guard let email = emailTextField.text, let password = passwordTextField.text else {
              resultTextView.text = "Email or password not set"
              return
          }
      
          nativeAuth.signUp(username: email,password: password,delegate: self)
      }
      

      kami menggunakan metode pustaka signUp(username:password:delegate) , yang merespons secara asinkron dengan memanggil salah satu metode pada objek delegasi yang diteruskan, yang harus menerapkan SignUpStartDelegate protokol. Baris kode berikut memulai proses pendaftaran pengguna:

      nativeAuth.signUp(username: email, password: password, delegate: self)
      

      Dalam metode ini signUp(username:password:delegate) , kami meneruskan alamat email pengguna, kata sandi mereka, dan delegasi (kelas yang menerapkan SignUpStartDelegate protokol).

    • Untuk menerapkan SignUpStartDelegate protokol sebagai ekstensi ke kelas kami, gunakan:

      extension ViewController: SignUpStartDelegate {
          func onSignUpStartError(error: MSAL.SignUpStartError) {
              resultTextView.text = "Error signing up: \(error.errorDescription ?? "no description")"
          }
      
          func onSignUpCodeRequired(
              newState: MSAL.SignUpCodeRequiredState,
              sentTo: String,
              channelTargetType: MSAL.MSALNativeAuthChannelType,
              codeLength: Int
          ) {
              resultTextView.text = "Verification code sent to \(sentTo)"
          }
      }
      

      Panggilan ke signUp(username:password:delegate) atau signUp(username:delegate) menghasilkan panggilan ke salah satu onSignUpCodeRequired() atau onSignUpStartError() mendelegasikan metode. dipanggil onSignUpCodeRequired(newState:sentTo:channelTargetType:codeLength) untuk menunjukkan bahwa kode telah dikirim untuk memverifikasi alamat email pengguna. Seiring dengan beberapa detail di mana kode telah dikirim, dan berapa banyak digit yang dikandungnya, metode delegasi ini juga memiliki newState parameter jenis SignUpCodeRequiredState, yang memberi kita akses ke dua metode baru:

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

      Untuk mengirimkan kode yang disediakan pengguna kepada kami, gunakan:

      newState.submitCode(code: userSuppliedCode, delegate: self)
      
      • Untuk menerapkan SignUpVerifyCodeDelegate protokol sebagai ekstensi ke kelas kami, gunakan:

        extension ViewController: SignUpVerifyCodeDelegate {
            func onSignUpVerifyCodeError(error: MSAL.VerifyCodeError, newState: MSAL.SignUpCodeRequiredState?) {
                resultTextView.text = "Error verifying code: \(error.errorDescription ?? "no description")"
            }
        
            func onSignUpCompleted(newState: SignInAfterSignUpState) {
                resultTextView.text = "Signed up successfully!"
            }
        }
        

        submitCode(code:delegate) menerima parameter delegasi dan kita harus menerapkan metode yang diperlukan dalam SignUpVerifyCodeDelegate protokol. Dalam skenario yang paling umum, kami menerima panggilan untuk onSignUpCompleted(newState) menunjukkan bahwa pengguna telah mendaftar dan alur selesai.

Kumpulkan atribut pengguna selama pendaftaran

Baik Anda mendaftarkan pengguna menggunakan kode akses satu kali email atau nama pengguna (email) dan kata sandi, Anda dapat mengumpulkan atribut pengguna sebelum akun pengguna dibuat. Metode ini signUp(username:attributes:delegate) , menerima atribut sebagai parameter.

  1. Untuk mengumpulkan atribut pengguna, gunakan cuplikan kode berikut:

    let attributes = [
        "country": "United States",
        "city": "Redmond"
    ]
    
    nativeAuth.signUp(username: email, attributes: attributes, delegate: self)
    

    signUp(username:attributes:delegate) Atau ignUp(username:password:attributes:delegate) menghasilkan panggilan ke salah satu onSignUpCodeRequired() atau onSignUpStartError() mendelegasikan metode, atau dalam panggilan ke onSignUpAttributesInvalid(attributeNames: [String]) jika diimplementasikan dalam delegasi.

  2. Untuk menerapkan SignUpStartDelegate protokol sebagai ekstensi ke kelas kami, gunakan cuplikan kode berikut:

    extension ViewController: SignUpStartDelegate {
        func onSignUpStartError(error: MSAL.SignUpStartError) {
            resultTextView.text = "Error signing up: \(error.errorDescription ?? "no description")"
        }
    
        func onSignUpCodeRequired(
            newState: MSAL.SignUpCodeRequiredState,
            sentTo: String,
            channelTargetType: MSAL.MSALNativeAuthChannelType,
            codeLength: Int
        ) {
            resultTextView.text = "Verification code sent to \(sentTo)"
        }
    
        func onSignUpAttributesInvalid(attributeNames: [String]) {
           resultTextView.text = "Invalid attributes  \(attributeNames)"
        }
    }
    

    Jika atribut tidak valid, metode onSignUpAttributesInvalid(attributeNames: [String]) dipanggil. Dalam hal ini, kami menampilkan daftar atribut yang tidak valid kepada pengguna. Jika tidak, dipanggil onSignUpCodeRequired(newState:sentTo:channelTargetType:codeLength) untuk menunjukkan bahwa kode telah dikirim untuk memverifikasi alamat email pengguna. Selain detail seperti penerima kode, dan jumlah digit kode, metode delegasi ini memiliki newState parameter jenis SignUpCodeRequiredState, yang memberi kita akses ke dua metode baru:

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

Atribut pengguna di satu atau beberapa halaman

Untuk menyebarkan atribut di satu atau beberapa halaman, kita harus mengatur atribut yang ingin kita kumpulkan di berbagai halaman sebagai wajib dalam konfigurasi penyewa manajemen identitas dan akses pelanggan (CIAM).

Kami memanggil signUp(username:password:delegate) tanpa meneruskan atribut apa pun. Langkah selanjutnya adalah memanggil newState.submitCode(code: userSuppliedCode, delegate: self) untuk memverifikasi email pengguna.

Kami menerapkan SignUpVerifyCodeDelegate protokol sebagai ekstensi ke kelas kami seperti sebelumnya, tetapi kali ini kita harus menerapkan metode onSignUpAttributesRequired(attributes:newState) opsional selain metode yang diperlukan:

extension ViewController: SignUpVerifyCodeDelegate {
    func onSignUpAttributesRequired(newState: SignUpAttributesRequiredState) {
        resultTextView.text = "Attributes required"
    }

    func onSignUpVerifyCodeError(error: MSAL.VerifyCodeError, newState: MSAL.SignUpCodeRequiredState?) {
        resultTextView.text = "Error verifying code: \(error.errorDescription ?? "no description")"
    }

    func onSignUpCompleted(newState: SignInAfterSignUpState) {
        resultTextView.text = "Signed up successfully!"
    }
}

Metode delegasi ini memiliki newState parameter jenis SignUpAttributesRequiredState, yang memberi kami akses ke metode baru:

  • submitAttributes(attributes:delegate)

Untuk mengirimkan atribut yang disediakan pengguna kepada kami, gunakan cuplikan kode berikut:

let attributes = [
    "country": "United States",
    "city": "Redmond"
]

newState.submitAttributes(attributes: attributes, delegate: self)

Kami juga akan menerapkan SignUpAttributesRequiredDelegate protokol sebagai ekstensi ke kelas kami:

extension ViewController: SignUpAttributesRequiredDelegate {
    func onSignUpAttributesRequiredError(error: AttributesRequiredError) {
        resultTextView.text = "Error submitting attributes: \(error.errorDescription ?? "no description")"
    }

    func onSignUpAttributesRequired(attributes: [MSALNativeAuthRequiredAttribute], newState: SignUpAttributesRequiredState) {
        resultTextView.text = "Attributes required"
    }

    func onSignUpAttributesInvalid(attributeNames: [String], newState: SignUpAttributesRequiredState) {
        resultTextView.text = "Attributes invalid"
    }

    func onSignUpCompleted(newState: SignInAfterSignUpState) {
        resultTextView.text = "Signed up successfully!"
    }
}

Ketika pengguna tidak menyediakan semua atribut yang diperlukan, atau atribut tidak valid, metode delegasi ini dipanggil:

  • onSignUpAttributesInvalid: menunjukkan bahwa satu atau beberapa atribut yang dikirim gagal input validasi. Kesalahan ini berisi parameter attributeNames, yang merupakan daftar semua atribut yang dikirim oleh pengembang yang gagal melakukan validasi input.
  • onSignUpAttributesRequired: menunjukkan bahwa server memerlukan satu atau beberapa atribut untuk dikirim, sebelum akun pengguna dapat dibuat. Ini terjadi ketika satu atau beberapa atribut ditetapkan sebagai wajib dalam konfigurasi penyewa. Hasil ini berisi parameter atribut, yang merupakan daftar MSALNativeAuthRequiredAttribute objek, yang menguraikan detail tentang atribut pengguna yang diperlukan API.

Kedua metode delegasi berisi referensi status baru. Kami menggunakan newState parameter untuk memanggil submitAttributes(attributes:delegate) lagi dengan atribut baru.

Menangani kesalahan pendaftaran

Selama pendaftaran, tidak setiap tindakan berhasil. Misalnya, pengguna mungkin mencoba mendaftar dengan alamat email yang sudah digunakan, atau mengirimkan kode yang tidak valid.

Dalam implementasi SignUpStartDelegate protokol sebelumnya, kami hanya menampilkan kesalahan ketika kami menangani onSignUpStartError(error) fungsi delegasi.

Untuk meningkatkan pengalaman pengguna dengan mengelola jenis kesalahan tertentu, gunakan cuplikan kode berikut:

func onSignUpStartError(error: MSAL.SignUpStartError) {
    if error.isUserAlreadyExists {
        resultTextView.text = "Unable to sign up: User already exists"
    } else if error.isInvalidPassword {
        resultTextView.text = "Unable to sign up: The password is invalid"
    } else if error.isInvalidUsername {
        resultTextView.text = "Unable to sign up: The username is invalid"
    } else {
        resultTextView.text = "Unexpected error signing up: \(error.errorDescription ?? "no description")"
    }
}

Opsional: Masuk setelah alur pendaftaran

Setelah alur pendaftaran berhasil, Anda dapat masuk ke pengguna tanpa memulai alur masuk. Pelajari lebih lanjut di artikel Tutorial: Masuk pengguna secara otomatis setelah mendaftar di aplikasi iOS/macOS.

Langkah selanjutnya