Aktifkan autentikasi di aplikasi Android Anda menggunakan Azure AD B2C
Artikel ini menunjukkan Anda cara menambahkan autentikasi Azure Active Directory B2C (Azure AD B2C) ke aplikasi Android Anda sendiri.
Gunakan artikel ini dengan Mengonfigurasi autentikasi dalam sampel aplikasi Android menggunakan Azure AD B2C, menggantikan sampel aplikasi Android dengan aplikasi Android milik 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 di sampel aplikasi Android dengan menggunakan Azure AD B2C.
Membuat proyek aplikasi Android
Jika Anda belum memiliki aplikasi Android, siapkan proyek baru dengan melakukan hal berikut:
- Di Android Studio, pilih Mulai proyek Android Studio baru.
- Pilih Aktivitas Dasar, lalu pilih Berikutnya.
- Beri nama aplikasi.
- Simpan nama paket. Anda akan memasukkannya nanti di portal Azure.
- Ubah bahasa pemrogram dari Kotlin ke Java.
- Atur Tingkat API minimum ke API 19 atau lebih tinggi, kemudian pilih Selesai.
- Dalam tampilan proyek, pilih Proyek di daftar drop-down untuk menampilkan file proyek sumber dan non-sumber, buka app/build.gradle, lalu atur targetSdkVersion ke 28.
Langkah 1: Menginstal dependensi
Di jendela proyek Android Studio, buka aplikasi>build.gradle, lalu tambahkan hal berikut:
apply plugin: 'com.android.application'
allprojects {
repositories {
mavenCentral()
google()
mavenLocal()
maven {
url 'https://pkgs.dev.azure.com/MicrosoftDeviceSDK/DuoSDK-Public/_packaging/Duo-SDK-Feed/maven/v1'
}
maven {
name "vsts-maven-adal-android"
url "https://identitydivision.pkgs.visualstudio.com/_packaging/AndroidADAL/maven/v1"
credentials {
username System.getenv("ENV_VSTS_MVN_ANDROIDADAL_USERNAME") != null ? System.getenv("ENV_VSTS_MVN_ANDROIDADAL_USERNAME") : project.findProperty("vstsUsername")
password System.getenv("ENV_VSTS_MVN_ANDROIDADAL_ACCESSTOKEN") != null ? System.getenv("ENV_VSTS_MVN_ANDROIDADAL_ACCESSTOKEN") : project.findProperty("vstsMavenAccessToken")
}
}
jcenter()
}
}
dependencies{
implementation 'com.microsoft.identity.client:msal:2.+'
}
packagingOptions{
exclude("META-INF/jersey-module-version")
}
Langkah 2: Menambahkan komponen autentikasi
Kode sampel terdiri dari komponen berikut. Tambahkan komponen ini dari contoh aplikasi Android ke aplikasi Anda sendiri.
Komponen | Jenis | Sumber | Deskripsi |
---|---|---|---|
B2CUser | Kelas | Kotlin Java | Mewakili pengguna B2C. Kelas ini memungkinkan pengguna untuk masuk dengan beberapa kebijakan. |
B2CModeFragment | Kelas fragmen | Kotlin Java | Fragmen mewakili bagian modular dari proses masuk dengan antarmuka pengguna Azure AD B2C dalam aktivitas utama Anda. Fragmen ini berisi sebagian besar kode autentikasi. |
fragment_b2c_mode.xml | Tata letak fragmen | Kotlin Java | Mendefinisikan struktur antarmuka pengguna untuk komponen fragmen B2CModeFragment. |
B2CConfiguration | Kelas | Kotlin Java | File konfigurasi memuat informasi tentang penyedia identitas Azure AD B2C Anda. Aplikasi seluler menggunakan informasi ini untuk menjalin hubungan kepercayaan dengan Azure AD B2C, memasukkan dan mengeluarkan pengguna, memperoleh token, dan memvalidasinya. Untuk pengaturan konfigurasi lainnya, lihat file auth_config_b2c.json. |
auth_config_b2c.json | File JSON | Kotlin Java | File konfigurasi memuat informasi tentang penyedia identitas Azure AD B2C Anda. Aplikasi seluler menggunakan informasi ini untuk menjalin hubungan kepercayaan dengan Azure AD B2C, memasukkan dan mengeluarkan pengguna, memperoleh token, dan memvalidasinya. Untuk pengaturan konfigurasi lainnya, lihat kelas B2CConfiguration. |
Langkah 3: Mengonfigurasi aplikasi Android Anda
Setelah Anda menambahkan komponen autentikasi, konfigurasikan aplikasi Android Anda dengan pengaturan Azure AD B2C. Pengaturan penyedia identitas Azure AD B2C dikonfigurasi dalam file auth_config_b2c.json dan kelas B2CConfiguration.
Untuk panduan, lihat Mengonfigurasi sampel aplikasi ponsel.
Langkah 4: Mengatur pengalihan URI
Konfigurasikan tempat aplikasi Anda mendengarkan respons token Azure AD B2C.
Hasilkan hash tanda tangan pengembangan baru. Ini akan berubah untuk setiap lingkungan pengembabgan.
Untuk Windows:
keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64
Untuk iOS:
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
Untuk lingkungan produksi, gunakan perintah berikut:
keytool -exportcert -alias SIGNATURE_ALIAS -keystore PATH_TO_KEYSTORE | openssl sha1 -binary | openssl base64
Untuk bantuan selengkapnya mengenai penandatanganan aplikasi Anda, lihat Menandatangani aplikasi Android Anda.
Pilih aplikasi>src>main>AndroidManifest.xml, lalu tambahkan aktivitas
BrowserTabActivity
berikut ke isi aplikasi:<!--Intent filter to capture System Browser or Authenticator calling back to our app after sign-in--> <activity android:name="com.microsoft.identity.client.BrowserTabActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="msauth" android:host="Package_Name" android:path="/Signature_Hash" /> </intent-filter> </activity>
Ganti
Signature_Hash
dengan hash yang Anda buat.Ganti
Package_Name
dengan nama paket Android Anda.
Untuk memperbarui pendaftaran aplikasi ponsel dengan URI pengalihan aplikasi Anda, lakukan hal berikut:
- Masuk ke portal Azure.
- Jika Anda memiliki akses ke beberapa penyewa, pilih ikon Pengaturan di menu atas untuk beralih ke penyewa Azure AD B2C Anda dari menu Direktori + langganan .
- Cari dan pilih Azure AD B2C.
- Pilih Pendaftaran aplikasi, lalu pilih aplikasi yang Anda daftarkan di Langkah 2.3: Mendaftarkan aplikasi ponsel.
- Pilih Autentikasi.
- Di bawah Android, pilih Tambahkan URI.
- Masukkan Nama paket dan Tanda tangan hash.
- Pilih Simpan.
Pengalihan URI Anda dan aktivitas BrowserTabActivity
harus terlihat mirip dengan sampel berikut:
URL pengalihan untuk sampel Android terlihat seperti ini:
msauth://com.azuresamples.msalandroidkotlinapp/1wIqXSqBj7w%2Bh11ZifsnqwgyKrY%3D
Filter niat menggunakan pola yang sama, seperti yang ditampilkan dalam cuplikan XML berikut:
<activity android:name="com.microsoft.identity.client.BrowserTabActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="com.azuresamples.msalandroidkotlinapp"
android:path="/1wIqXSqBj7w+h11ZifsnqwgyKrY="
android:scheme="msauth" />
</intent-filter>
</activity>
Langkah 5: Menyesuaikan blok penyusun kode Anda
Bagian ini menjelaskan blok penyusun kode yang mengaktifkan autentikasi untuk aplikasi Android Anda. Tabel berikut mencantumkan metode B2CModeFragment dan cara menyesuaikan kode Anda.
Langkah 5.1: Membuat instans aplikasi klien publik
Aplikasi klien publik tidak dipercaya untuk menyimpan rahasia aplikasi dengan aman, dan mereka tidak memiliki rahasia klien. Di onCreate atau onCreateView, buat instans MSAL dengan menggunakan objek aplikasi klien publik multi-akun.
Kelas MultipleAccountPublicClientApplication
ini digunakan untuk membuat aplikasi berbasis MSAL yang memungkinkan beberapa akun masuk secara bersamaan. Kelas mengizinkan masuk dengan beberapa alur pengguna Azure AD B2C atau kebijakan kustom. Misalnya, pengguna masuk dengan alur pengguna daftar atau masuk dan kemudian, mereka menjalankan alur pengguna edit profil.
Cuplikan kode berikut menunjukkan cara memulai pustaka MSAL dalam file JSON konfigurasi auth_config_b2c.json
.
PublicClientApplication.createMultipleAccountPublicClientApplication(context!!,
R.raw.auth_config_b2c,
object : IMultipleAccountApplicationCreatedListener {
override fun onCreated(application: IMultipleAccountPublicClientApplication) {
// Set the MultipleAccountPublicClientApplication to the class member b2cApp
b2cApp = application
// Load the account (if there is any)
loadAccounts()
}
override fun onError(exception: MsalException) {
// Error handling
displayError(exception)
}
})
Langkah 5.2: Memuat akun
Saat aplikasi muncul di latar depan, aplikasi memuat akun yang ada untuk menentukan apakah pengguna masuk. Gunakan metode ini untuk memperbarui UI dengan status autentikasi. Misalnya, Anda dapat mengaktifkan atau menonaktifkan tombol keluar.
Cuplikan kode berikut menunjukkan cara memuat akun.
private fun loadAccounts() {
if (b2cApp == null) {
return
}
b2cApp!!.getAccounts(object : LoadAccountsCallback {
override fun onTaskCompleted(result: List<IAccount>) {
users = B2CUser.getB2CUsersFromAccountList(result)
updateUI(users)
}
override fun onError(exception: MsalException) {
displayError(exception)
}
})
}
Langkah 5.3: Memulai permintaan otorisasi interaktif
Permintaan otorisasi interaktif adalah alur yang meminta pengguna untuk mendaftar atau masuk. Metode initializeUI
mengonfigurasi peristiwa klik runUserFlowButton
. Saat pengguna memilih tombol Jalankan Alur Pengguna, aplikasi akan mengarahkan mereka ke Azure AD B2C untuk menyelesaikan alur masuk.
Metode runUserFlowButton.setOnClickListener
menyiapkan objek AcquireTokenParameters
dengan data yang relevan tentang permintaan otorisasi. Metode acquireToken
kemudian meminta pengguna untuk menyelesaikan alur pendaftaran atau masuk.
Cuplikan kode berikut menunjukkan cara memulai permintaan otorisasi interaktif:
val parameters = AcquireTokenParameters.Builder()
.startAuthorizationFromActivity(activity)
.fromAuthority(getAuthorityFromPolicyName(policy_list.getSelectedItem().toString()))
.withScopes(B2CConfiguration.scopes)
.withPrompt(Prompt.LOGIN)
.withCallback(authInteractiveCallback)
.build()
b2cApp!!.acquireToken(parameters)
Langkah 5.4: Membuat panggilan balik permintaan otorisasi interaktif
Setelah pengguna menyelesaikan alur otorisasi, baik berhasil atau tidak, hasilnya dikembalikan ke metode panggilan balik getAuthInteractiveCallback()
.
Metode panggilan balik meneruskan objek AuthenticationResult
, atau pesan kesalahan objek MsalException
. Gunakan metode ini untuk:
- Perbarui UI aplikasi ponsel dengan informasi setelah proses masuk selesai.
- Muat ulang objek akun.
- Hubungi layanan API web dengan token akses.
- Menangani kesalahan autentikasi.
Cuplikan kode berikut menunjukkan penggunaan panggilan balik autentikasi interaktif.
private val authInteractiveCallback: AuthenticationCallback
private get() = object : AuthenticationCallback {
override fun onSuccess(authenticationResult: IAuthenticationResult) {
/* Successfully got a token, use it to call a protected resource; web API */
Log.d(TAG, "Successfully authenticated")
/* display result info */
displayResult(authenticationResult)
/* Reload account asynchronously to get the up-to-date list. */
loadAccounts()
}
override fun onError(exception: MsalException) {
val B2C_PASSWORD_CHANGE = "AADB2C90118"
if (exception.message!!.contains(B2C_PASSWORD_CHANGE)) {
txt_log!!.text = """
Users click the 'Forgot Password' link in a sign-up or sign-in user flow.
Your application needs to handle this error code by running a specific user flow that resets the password.
""".trimIndent()
return
}
/* Failed to acquireToken */Log.d(TAG, "Authentication failed: $exception")
displayError(exception)
if (exception is MsalClientException) {
/* Exception inside MSAL, more info inside MsalError.java */
} else if (exception is MsalServiceException) {
/* Exception when communicating with the STS, likely config issue */
}
}
override fun onCancel() {
/* User canceled the authentication */
Log.d(TAG, "User cancelled login.")
}
}
Langkah 6: Memanggil API web
Untuk memanggil API web otorisasi berbasis token, aplikasi perlu memiliki token akses yang valid. Aplikasi kemudian 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 masuk secara interaktif, aplikasi mendapatkan token akses dalam metode getAuthInteractiveCallback
panggilan balik. Untuk panggilan API web berturut-turut, gunakan prosedur diam peroleh token seperti yang dijelaskan di bagian ini.
Sebelum Anda memanggil API web, panggil metode acquireTokenSilentAsync
dengan cakupan yang sesuai untuk titik akhir API web Anda. Pustaka MSAL melakukan hal berikut:
- Mencoba untuk mengambil token akses dengan cakupan yang diminta dari cache token. Jika token hadir, token tersebut dikembalikan.
- Jika token tidak hadir dalam cache token, MSAL mencoba menggunakan token refresh untuk mendapatkan token baru.
- Jika token refresh tidak ada atau telah kedaluwarsa, pengecualian dikembalikan. Sebaiknya Anda meminta pengguna untuk masuk secara interaktif.
Cuplikan kode berikut menunjukkan cara mendapatkan token akses:
Peristiwa klik tombol acquireTokenSilentButton
memperoleh token akses dengan ruang lingkup yang disediakan.
btn_acquireTokenSilently.setOnClickListener(View.OnClickListener {
if (b2cApp == null) {
return@OnClickListener
}
val selectedUser = users!![user_list.getSelectedItemPosition()]
selectedUser.acquireTokenSilentAsync(b2cApp!!,
policy_list.getSelectedItem().toString(),
B2CConfiguration.scopes,
authSilentCallback)
})
Metode panggilan balik authSilentCallback
mengembalikan token akses dan memanggil API web:
private val authSilentCallback: SilentAuthenticationCallback
private get() = object : SilentAuthenticationCallback {
override fun onSuccess(authenticationResult: IAuthenticationResult) {
Log.d(TAG, "Successfully authenticated")
/* Call your web API here*/
callWebAPI(authenticationResult)
}
override fun onError(exception: MsalException) {
/* Failed to acquireToken */
Log.d(TAG, "Authentication failed: $exception")
displayError(exception)
if (exception is MsalClientException) {
/* Exception inside MSAL, more info inside MsalError.java */
} else if (exception is MsalServiceException) {
/* Exception when communicating with the STS, likely config issue */
} else if (exception is MsalUiRequiredException) {
/* Tokens expired or no session, retry with interactive */
}
}
}
Contoh berikut menunjukkan cara memanggil API web yang dilindungi dengan token pembawa:
@Throws(java.lang.Exception::class)
private fun callWebAPI(authenticationResult: IAuthenticationResult) {
val accessToken = authenticationResult.accessToken
val thread = Thread {
try {
val url = URL("https://your-app-service.azurewebsites.net/helo")
val conn = url.openConnection() as HttpsURLConnection
conn.setRequestProperty("Accept", "application/json")
// Set the bearer token
conn.setRequestProperty("Authorization", "Bearer $accessToken")
if (conn.responseCode == HttpURLConnection.HTTP_OK) {
val br = BufferedReader(InputStreamReader(conn.inputStream))
var strCurrentLine: String?
while (br.readLine().also { strCurrentLine = it } != null) {
Log.d(TAG, strCurrentLine)
}
}
conn.disconnect()
} catch (e: IOException) {
e.printStackTrace()
} catch (e: Exception) {
e.printStackTrace()
}
}
thread.start()
}
Menambahkan izin untuk melakukan operasi jaringan
Untuk melakukan operasi jaringan di aplikasi Anda, tambahkan izin berikut ke manifes Anda. Untuk informasi selengkapnya, lihat Bersambung ke jaringan.
<uses-permission android:name="android.permission.INTERNET"/>
Langkah berikutnya
Pelajari cara: