Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk: Penyewa Tenaga Kerja
Penyewa Eksternal (selengkapnya)
Tutorial ini menunjukkan cara masuk dan keluar dari pengguna dengan kode sandi satu kali email atau nama pengguna dan kata sandi di aplikasi iOS/macOS Anda dengan menggunakan autentikasi asli.
Dalam tutorial ini, Anda mempelajari cara:
- Masuk ke akun pengguna menggunakan kode sekali pakai untuk email atau nama pengguna (email) dan kata sandi.
- Keluarkan pengguna.
- Menangani kesalahan masuk
Prasyarat
- Tutorial: Siapkan aplikasi iOS/macOS Anda untuk autentikasi bawaan.
- Jika Anda ingin masuk menggunakan Email dengan kata sandi, konfigurasikan alur pengguna Anda untuk menggunakan Email dengan kata sandi saat Anda membuat alur pendaftaran dan masuk pengguna.
Masuk sebagai pengguna
Untuk mengautentikasi pengguna menggunakan alur kode sandi satu kali email, dapatkan alamat email dan kirim email yang berisi kode sandi satu kali agar pengguna dapat memastikan email mereka. Saat pengguna memasukkan kode sandi satu kali yang valid, aplikasi akan mendaftarkan mereka masuk.
Untuk masuk sebagai pengguna menggunakan alur email dengan kata sandi, catat email dan kata sandi. Jika nama pengguna dan kata sandi valid, aplikasi akan mengautentikasi pengguna.
Untuk masuk sebagai pengguna, Anda perlu:
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 masuk dengan nama pengguna (email) dan kata sandi.
- Kumpulkan kode akses satu kali email dari pengguna jika Anda masuk dengan kode akses satu kali email.
- Tambahkan tombol untuk memungkinkan pengguna mengirim ulang kode akses satu kali jika Anda masuk dengan kode akses satu kali email.
Di UI Anda, tambahkan tombol, yang peristiwa pilihnya memulai masuk seperti yang ditunjukkan dalam cuplikan kode berikut:
@IBAction func signInPressed(_: Any) { guard let email = emailTextField.text else { resultTextView.text = "email not set" return } let parameters = MSALNativeAuthSignInParameters(username: email) nativeAuth.signIn(parameters: parameters, delegate: self) }
Untuk memasukkan pengguna menggunakan Email kode akses satu kali alur, kami menggunakan cuplikan kode berikut:
nativeAuth.signIn(parameters: parameters, delegate: self)
Metode
signIn(parameters:delegate)
, yang merespons secara asinkron dengan memanggil salah satu metode pada objek delegasi yang diteruskan, harus menerapkan protokolSignInStartDelegate
. Kami mengirimkan instanceMSALNativeAuthSignInParameters
yang berisi alamat email yang disediakan oleh pengguna dalam formulir untuk pengiriman email kemudian meneruskanself
sebagai delegasi.Untuk memasukkan pengguna menggunakan Email dengan alur kata sandi, kami menggunakan cuplikan kode berikut:
let parameters = MSALNativeAuthSignInParameters(username: email) parameters.password = password nativeAuth.signIn(parameters: parameters, delegate: self)
Dalam metode
signIn(parameters:delegate)
, Anda meneruskan instansMSALNativeAuthSignInParameters
yang berisi alamat email yang disediakan pengguna kepada kami dan kata sandi mereka, bersama dengan objek delegasi yang sesuai dengan protokolSignInStartDelegate
. Untuk contoh ini, kami mengirimkanself
.Untuk menerapkan protokol
SignInStartDelegate
saat Anda menggunakan alur kode sandi satu kali email , gunakan cuplikan kode berikut:extension ViewController: SignInStartDelegate { func onSignInStartError(error: MSAL.SignInStartError) { resultTextView.text = "Error signing in: \(error.errorDescription ?? "no description")" } func onSignInCodeRequired( newState: MSAL.SignInCodeRequiredState, sentTo: String, channelTargetType: MSAL.MSALNativeAuthChannelType, codeLength: Int ) { resultTextView.text = "Verification code sent to \(sentTo)" } }
signIn(parameters:delegate)
menghasilkan panggilan untuk mendelegasikan metode. Dalam skenario yang paling umum,onSignInCodeRequired(newState:sentTo:channelTargetType:codeLength)
dipanggil 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 parameternewState
jenisSignInCodeRequiredState
, yang memberi kami akses ke dua metode baru berikut:submitCode(code:delegate)
resendCode(delegate)
Gunakan
submitCode(code:delegate)
untuk mengirimkan kode sandi satu kali yang disediakan pengguna dalam formulir kode sandi satu kali, gunakan cuplikan kode berikut:newState.submitCode(code: userSuppliedCode, delegate: self)
submitCode(code:delegate)
menerima kode akses satu kali dan mendelegasikan parameter. Setelah mengirimkan kode, Anda harus memverifikasi kode akses satu kali dengan menerapkan protokolSignInVerifyCodeDelegate
.Untuk menerapkan protokol
SignInVerifyCodeDelegate
sebagai ekstensi ke kelas Anda, gunakan cuplikan kode berikut:extension ViewController: SignInVerifyCodeDelegate { func onSignInVerifyCodeError(error: MSAL.VerifyCodeError, newState: MSAL.SignInCodeRequiredState?) { resultTextView.text = "Error verifying code: \(error.errorDescription ?? "no description")" } func onSignInCompleted(result: MSALNativeAuthUserAccountResult) { resultTextView.text = "Signed in successfully." let parameters = MSALNativeAuthGetAccessTokenParameters() result.getAccessToken(parameters: parameters, delegate: self) } }
Dalam skenario yang paling umum, kami menerima panggilan ke
onSignInCompleted(result)
menunjukkan bahwa pengguna telah masuk. Hasilnya dapat digunakan untuk mengaksesaccess token
.getAccessToken(parameters:delegate)
menerima instansMSALNativeAuthGetAccessTokenParameters
dan parameter delegasi dan kita harus menerapkan metode yang diperlukan dalam protokolCredentialsDelegate
.Dalam skenario yang paling umum, kami menerima panggilan ke
onAccessTokenRetrieveCompleted(result)
yang menunjukkan bahwa pengguna memperolehaccess 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)" } }
Untuk menerapkan protokol
SignInStartDelegate
saat Anda menggunakan Email dengan alur kata sandi, gunakan cuplikan kode berikut:extension ViewController: SignInStartDelegate { func onSignInStartError(error: MSAL.SignInStartError) { resultTextView.text = "Error signing in: \(error.errorDescription ?? "no description")" } func onSignInCompleted(result: MSAL.MSALNativeAuthUserAccountResult) { // User successfully signed in } }
Dalam skenario yang paling umum, kami menerima panggilan ke
onSignInCompleted(result)
menunjukkan bahwa pengguna telah masuk. Hasilnya dapat digunakan untuk mengambilaccess token
.getAccessToken(parameters:delegate)
menerima instansMSALNativeAuthGetAccessTokenParameters
dan parameter delegasi dan kita harus menerapkan metode yang diperlukan dalam protokolCredentialsDelegate
.Dalam skenario yang paling umum, kami menerima panggilan ke
onAccessTokenRetrieveCompleted(result)
menunjukkan bahwa pengguna memperolehaccess 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)" } }
Menangani kesalahan login
Saat masuk, tidak semua tindakan berhasil. Misalnya, pengguna mungkin mencoba masuk dengan alamat email yang tidak ada, atau mengirimkan kode yang tidak valid.
Untuk menangani kesalahan dalam metode
signIn(parameters:delegate)
, gunakan cuplikan kode berikut:func onSignInStartError(error: MSAL.SignInStartError) { if error.isUserNotFound || error.isInvalidUsername { resultTextView.text = "Invalid username" } else { resultTextView.text = "Error signing in: \(error.errorDescription ?? "no description")" } }
Untuk menangani kesalahan dalam metode
submitCode()
, gunakan cuplikan kode berikut:func onSignInVerifyCodeError(error: MSAL.VerifyCodeError, newState: MSAL.SignInCodeRequiredState?) { if error.isInvalidCode { // Inform the user that the submitted code was incorrect and ask for a new code to be supplied let userSuppliedCode = retrieveNewCode() newState?.submitCode(code: userSuppliedCode, delegate: self) } else { resultTextView.text = "Error verifying code: \(error.errorDescription ?? "no description")" } }
Jika pengguna memasukkan kode verifikasi email yang salah, penanganan kesalahan menyertakan referensi ke
SignInCodeRequiredState
yang dapat digunakan untuk mengirimkan kode yang diperbarui. Dalam implementasi protokolSignInVerifyCodeDelegate
sebelumnya, kami hanya menampilkan kesalahan ketika kami menangani fungsi delegasionSignInVerifyCodeError(error:newState)
.
Membaca klaim token ID
Setelah aplikasi memperoleh token ID, Anda dapat mengambil klaim yang terkait dengan akun saat ini. Untuk melakukannya, gunakan cuplikan kode berikut:
func onSignInCompleted(result: MSAL.MSALNativeAuthUserAccountResult) {
let claims = result.account.accountClaims
let preferredUsername = claims?["preferred_username"] as? String
}
Kunci yang Anda gunakan untuk mengakses nilai klaim adalah nama yang Anda tentukan saat menambahkan atribut pengguna sebagai klaim token.
Pelajari cara menambahkan atribut bawaan dan kustom sebagai klaim token di artikel Menambahkan atribut pengguna ke klaim token.
Keluar dari pengguna
Untuk mengeluarkan pengguna, gunakan referensi ke MSALNativeAuthUserAccountResult
yang Anda terima dalam panggilan balik onSignInCompleted
, atau gunakan getNativeAuthUserAccount()
untuk mendapatkan akun masuk apa pun dari cache dan menyimpan referensi dalam variabel anggota accountResult
.
Konfigurasikan grup rantai kunci untuk proyek Anda seperti yang dijelaskan di sini.
Tambahkan variabel anggota baru ke kelas
ViewController
Anda:var accountResult: MSALNativeAuthUserAccountResult?
.Perbarui
viewDidLoad
untuk mengambil akun yang di-cache dengan menambahkan baris ini setelahnativeAuth
berhasil diinisialisasi:accountResult = nativeAuth.getNativeAuthUserAccount()
.Perbarui handler
signInCompleted
untuk menyimpan hasil akun:func onSignInCompleted(result: MSALNativeAuthUserAccountResult) { resultTextView.text = "Signed in successfully" accountResult = result }
Tambahkan tombol Keluar dan gunakan kode berikut untuk mengeluarkan pengguna:
@IBAction func signOutPressed(_: Any) { guard let accountResult = accountResult else { print("Not currently signed in") return } accountResult.signOut() self.accountResult = nil resultTextView.text = "Signed out" }
Anda telah berhasil menyelesaikan semua langkah yang diperlukan untuk mengeluarkan pengguna di aplikasi Anda. Buat dan jalankan aplikasi Anda. Jika semuanya berjalan lancar, Anda harus dapat memilih tombol keluar untuk berhasil log out.
Mengonfigurasi penyedia klaim kustom
Jika Anda ingin menambahkan klaim dari sistem eksternal ke dalam token yang dikeluarkan untuk aplikasi Anda, gunakan penyedia klaim kustom . Penyedia klaim kustom terdiri dari ekstensi autentikasi kustom yang memanggil REST API eksternal untuk mengambil klaim dari sistem eksternal.
Ikuti langkah-langkah dalam Mengonfigurasi penyedia klaim kustom untuk menambahkan klaim dari sistem eksternal ke dalam token keamanan Anda.