Mengaktifkan autentikasi di aplikasi Swift iOS milik Anda menggunakan Azure AD B2C
Artikel ini menunjukkan Anda cara menambahkan autentikasi Azure Active Directory B2C (Azure AD B2C) ke aplikasi iOS Swift Anda sendiri. Pelajari cara mengintegrasikan aplikasi Swift iOS dengan Microsoft Authentication Library (MSAL) untuk iOS.
Gunakan artikel ini dengan Mengonfigurasi autentikasi dalam contoh aplikasi iOS Swift, mengganti sendiri sampel aplikasi iOS Swift dengan aplikasi iOS Swift Anda. Setelah Anda menyelesaikan instruksi dalam artikel ini, aplikasi Anda akan menerima proses masuk melalui Azure AD B2C.
Prasyarat
Tinjau prasyarat dan petunjuk integrasi di Mengonfigurasi autentikasi dalam sampel aplikasi Swift iOS menggunakan Azure AD B2C.
Membuat proyek aplikasi iOS Swift
Jika Anda belum memiliki aplikasi iOS Swift, siapkan proyek baru dengan melakukan langkah-langkah berikut:
- Buka Xcode, lalu pilih File>Baru>Proyek.
- Untuk aplikasi iOS, pilih iOS>Aplikasi, lalu pilih Berikutnya.
- Untuk Memilih opsi untuk proyek baru Anda, berikan hal berikut:
-
Nama produk, seperti
MSALiOS
. -
Pengidentifikasi organisasi, seperti
contoso.com
. - Untuk opsi Interface, pilih Storyboard.
- Untuk opsi Life cycle, pilih UIKit App Delegate.
- Untuk opsi Language, pilih Swift.
-
Nama produk, seperti
- Pilih Selanjutnya.
- Pilih folder untuk membuat aplikasi Anda, lalu pilih Buat.
Langkah 1: Menginstal pustaka MSAL
Gunakan CocoaPods untuk menginstal pustaka MSAL. Di folder yang sama dengan file .xcodeproj proyek Anda, jika file podfile tidak ada, buat file kosong dan beri nama podfile. Tambahkan kode berikut ke file podfile:
use_frameworks! target '<your-target-here>' do pod 'MSAL' end
Ganti
<your-target-here>
dengan nama proyek Anda (misalnya,MSALiOS
). Untuk informasi lebih lanjut, lihat Referensi Sintaks Podfile.Di jendela terminal, buka folder yang berisi file podfile, lalu jalankan penginstalan pod untuk menginstal pustaka MSAL.
Setelah Anda menjalankan perintah
pod install
, file <nama proyek Anda>.xcworkspace akan dibuat. Untuk memuat ulang proyek dalam Xcode, tutup Xcode, lalu buka file <nama proyek Anda>.xcworkspace.
Langkah 2: Mengatur skema URL aplikasi
Saat pengguna mengautentikasi, Azure AD B2C mengirimkan kode otorisasi ke aplikasi menggunakan URI pengalihan yang dikonfigurasi pada pendaftaran aplikasi Azure AD B2C.
Format URI pengalihan default MSAL adalah msauth.[Your_Bundle_Id]://auth
. Contohnya adalah msauth.com.microsoft.identitysample.MSALiOS://auth
, di mana msauth.com.microsoft.identitysample.MSALiOS
adalah skema URL.
Pada langkah ini, daftarkan skema URL Anda menggunakan array CFBundleURLSchemes
. Aplikasi Anda mendengarkan skema URL untuk memanggil kembali dari Azure AD B2C.
Di Xcode, buka file Info.plist sebagai file kode sumber. Di bagian <dict>
, tambahkan cuplikan XML berikut:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>msauth.com.microsoft.identitysample.MSALiOS</string>
</array>
</dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>msauthv2</string>
<string>msauthv3</string>
</array>
Langkah 3: Menambahkan kode autentikasi
Kode sampel dibuat dari kelas UIViewController
. Kelas:
- Mendefinisikan struktur untuk antarmuka pengguna.
- Memuat informasi tentang penyedia identitas Azure AD B2C Anda. Aplikasi ini menggunakan informasi ini untuk membangun hubungan kepercayaan dengan Azure Active Directory B2C.
- Berisi kode autentikasi untuk mengautentikasi pengguna, memperoleh token, dan memvalidasinya.
Pilih tempat UIViewController
pengguna mengautentikasi. Di UIViewController
Anda, gabungkan kode dengan kode yang disediakan di GitHub.
Langkah 4: Mengonfigurasi aplikasi Swift iOS Anda
Setelah Anda menambahkan kode autentikasi, konfigurasikan aplikasi iOS Swift Anda dengan pengaturan Azure AD B2C. Pengaturan penyedia identitas Azure AD B2C dikonfigurasi di kelas UIViewController
yang dipilih di bagian sebelumnya.
Untuk mempelajari cara mengonfigurasi aplikasi Swift iOS Anda, lihat Mengonfigurasi autentikasi dalam sampel aplikasi Swift iOS menggunakan Azure AD B2C.
Langkah 5: Menjalankan dan menguji aplikasi seluler
- Membangun dan menjalankan proyek dengan simulator perangkat iOS yang terhubung.
- Pilih Masuk, lalu daftar atau masuk dengan akun lokal atau sosial Azure AD B2C Anda.
- Setelah Anda berhasil mengautentikasi, Anda akan melihat nama tampilan Anda di bilah navigasi.
Langkah 6: Menyesuaikan blok penyusun kode Anda
Bagian ini menjelaskan blok penyusun kode yang mengaktifkan autentikasi untuk aplikasi Swift iOS Anda. Ini mencantumkan metode UIViewController dan membahas cara menyesuaikan kode Anda.
Langkah 6.1: Membuat instans aplikasi klien publik
Aplikasi klien publik tidak dipercaya untuk menyimpan rahasia aplikasi dengan aman, dan mereka tidak memiliki rahasia klien. Di viewDidLoad, buat instans MSAL menggunakan objek aplikasi klien publik.
Cuplikan kode Swift berikut menunjukkan cara membuat instans MSAL dengan objek konfigurasi MSALPublicClientApplicationConfig
.
Objek konfigurasi menyediakan informasi tentang lingkungan Azure AD B2C Anda. Misalnya, ini menyediakan ID klien, mengalihkan URI, dan otoritas untuk membuat permintaan autentikasi ke Azure AD B2C. Untuk informasi tentang objek konfigurasi, lihat Mengonfigurasi sampel aplikasi seluler.
do {
let signinPolicyAuthority = try self.getAuthority(forPolicy: self.kSignupOrSigninPolicy)
let editProfileAuthority = try self.getAuthority(forPolicy: self.kEditProfilePolicy)
let pcaConfig = MSALPublicClientApplicationConfig(clientId: kClientID, redirectUri: kRedirectUri, authority: signinPolicyAuthority)
pcaConfig.knownAuthorities = [signinPolicyAuthority, editProfileAuthority]
self.applicationContext = try MSALPublicClientApplication(configuration: pcaConfig)
self.initWebViewParams()
} catch {
self.updateLoggingText(text: "Unable to create application \(error)")
}
Metode initWebViewParams
mengonfigurasi pengalaman autentikasi interaktif.
Cuplikan kode Swift berikut menginisialisasi anggota kelas webViewParameters
dengan tampilan web sistem. Untuk informasi selengkapnya, lihat Menyesuaikan browser dan WebViews untuk iOS/macOS.
func initWebViewParams() {
self.webViewParameters = MSALWebviewParameters(authPresentationViewController: self)
self.webViewParameters?.webviewType = .default
}
Langkah 6.2: Mulai permintaan otorisasi interaktif
Permintaan otorisasi interaktif adalah alur tempat pengguna diminta untuk mendaftar atau masuk menggunakan tampilan web sistem. Saat pengguna memilih tombol Masuk, metode authorizationButton
akan dipanggil.
Metode authorizationButton
menyiapkan objek MSALInteractiveTokenParameters
dengan data yang relevan tentang permintaan otorisasi. Metode acquireToken
menggunakan MSALInteractiveTokenParameters
untuk mengautentikasi pengguna melalui tampilan web sistem.
Cuplikan kode berikut menunjukkan cara memulai permintaan otorisasi interaktif:
let parameters = MSALInteractiveTokenParameters(scopes: kScopes, webviewParameters: self.webViewParameters!)
parameters.promptType = .selectAccount
parameters.authority = authority
applicationContext.acquireToken(with: parameters) { (result, error) in
// On error code
guard let result = result else {
self.updateLoggingText(text: "Could not acquire token: \(error ?? "No error information" as! Error)")
return
}
// On success code
self.accessToken = result.accessToken
self.updateLoggingText(text: "Access token is \(self.accessToken ?? "Empty")")
}
Setelah pengguna menyelesaikan alur otorisasi, baik berhasil atau tidak, hasilnya dikembalikan ke penutupan metode acquireToken
.
Metode acquireToken
mengembalikan objek result
dan error
. Gunakan penutup ini untuk:
- Memperbarui UI aplikasi seluler dengan informasi setelah autentikasi selesai.
- Hubungi layanan API web dengan token akses.
- Menangani kesalahan autentikasi (misalnya, saat pengguna membatalkan alur login).
Langkah 6.3: Memanggil API web
Untuk memanggil API web otorisasi berbasis token, aplikasi memerlukan token akses yang valid. Aplikasi melakukan hal berikut:
- Memperoleh token akses dengan izin yang diperlukan (cakupan) untuk titik akhir API web.
- Melewati token akses sebagai token pembawa di header otorisasi permintaan HTTP dengan menggunakan format ini:
Authorization: Bearer <access-token>
Saat pengguna mengakses secara interaktif, aplikasi mendapatkan token akses dalam penutupacquireToken
. Untuk panggilan API web berikutnya, gunakan metode akuisisi token diam (acquireTokenSilent
), seperti yang dijelaskan di bagian ini.
Metode melakukan acquireTokenSilent
tindakan berikut:
- Ini mencoba untuk mengambil token akses dengan cakupan yang diminta dari cache token. Jika token ada dan belum kedaluwarsa, token dikembalikan.
- Jika token tidak ada dalam cache token atau telah kedaluwarsa, pustaka MSAL mencoba menggunakan token penyegaran untuk memperoleh token akses baru.
- Jika token refresh tidak ada atau telah kedaluwarsa, pengecualian dikembalikan. Dalam kasus ini, Anda disarankan untuk meminta pengguna masuk secara interaktif.
Cuplikan kode berikut menunjukkan cara mendapatkan token akses:
do {
// Get the authority using the sign-in or sign-up user flow
let authority = try self.getAuthority(forPolicy: self.kSignupOrSigninPolicy)
// Get the current account from the application context
guard let thisAccount = try self.getAccountByPolicy(withAccounts: applicationContext.allAccounts(), policy: kSignupOrSigninPolicy) else {
self.updateLoggingText(text: "There is no account available!")
return
}
// Configure the acquire token silent parameters
let parameters = MSALSilentTokenParameters(scopes: kScopes, account:thisAccount)
parameters.authority = authority
parameters.loginHint = "username"
// Acquire token silent
self.applicationContext.acquireTokenSilent(with: parameters) { (result, error) in
if let error = error {
let nsError = error as NSError
// interactionRequired means we need to ask the user to sign in. This usually happens
// when the user's Refresh Token is expired or if the user has changed their password
// among other possible reasons.
if (nsError.domain == MSALErrorDomain) {
if (nsError.code == MSALError.interactionRequired.rawValue) {
// Start an interactive authorization code
// Notice we supply the account here. This ensures we acquire token for the same account
// as we originally authenticated.
...
}
}
self.updateLoggingText(text: "Could not acquire token: \(error)")
return
}
guard let result = result else {
self.updateLoggingText(text: "Could not acquire token: No result returned")
return
}
// On success, set the access token to the accessToken class member.
// The callGraphAPI method uses the access token to call a web API
self.accessToken = result.accessToken
...
}
} catch {
self.updateLoggingText(text: "Unable to construct parameters before calling acquire token \(error)")
}
Metode callGraphAPI
mengambil token akses dan memanggil API web, seperti yang ditunjukkan di sini:
@objc func callGraphAPI(_ sender: UIButton) {
guard let accessToken = self.accessToken else {
self.updateLoggingText(text: "Operation failed because could not find an access token!")
return
}
let sessionConfig = URLSessionConfiguration.default
sessionConfig.timeoutIntervalForRequest = 30
let url = URL(string: self.kGraphURI)
var request = URLRequest(url: url!)
request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
let urlSession = URLSession(configuration: sessionConfig, delegate: self, delegateQueue: OperationQueue.main)
self.updateLoggingText(text: "Calling the API....")
urlSession.dataTask(with: request) { data, response, error in
guard let validData = data else {
self.updateLoggingText(text: "Could not call API: \(error ?? "No error information" as! Error)")
return
}
let result = try? JSONSerialization.jsonObject(with: validData, options: [])
guard let validResult = result as? [String: Any] else {
self.updateLoggingText(text: "Nothing returned from API")
return
}
self.updateLoggingText(text: "API response: \(validResult.debugDescription)")
}.resume()
}
Langkah 6.4: Mengeluarkan pengguna
Keluar dengan MSAL menghapus semua informasi yang diketahui tentang pengguna dari aplikasi. Gunakan metode keluar untuk mengeluarkan pengguna dan memperbarui UI. Misalnya, Anda dapat menyembunyikan elemen UI yang dilindungi, menyembunyikan tombol keluar, atau menampilkan tombol masuk.
Cuplikan kode berikut menunjukkan cara mengeluarkan pengguna:
@objc func signoutButton(_ sender: UIButton) {
do {
let thisAccount = try self.getAccountByPolicy(withAccounts: applicationContext.allAccounts(), policy: kSignupOrSigninPolicy)
if let accountToRemove = thisAccount {
try applicationContext.remove(accountToRemove)
} else {
self.updateLoggingText(text: "There is no account to signing out!")
}
...
} catch {
self.updateLoggingText(text: "Received error signing out: \(error)")
}
}
Langkah berikutnya
Pelajari cara: