Bagikan melalui


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:

  1. Di Android Studio, pilih Mulai proyek Android Studio baru.
  2. Pilih Aktivitas Dasar, lalu pilih Berikutnya.
  3. Beri nama aplikasi.
  4. Simpan nama paket. Anda akan memasukkannya nanti di portal Azure.
  5. Ubah bahasa pemrogram dari Kotlin ke Java.
  6. Atur Tingkat API minimum ke API 19 atau lebih tinggi, kemudian pilih Selesai.
  7. 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.

  1. 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.

  2. 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>
    
  3. Ganti Signature_Hash dengan hash yang Anda buat.

  4. Ganti Package_Name dengan nama paket Android Anda.

Untuk memperbarui pendaftaran aplikasi ponsel dengan URI pengalihan aplikasi Anda, lakukan hal berikut:

  1. Masuk ke portal Azure.
  2. 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 .
  3. Cari dan pilih Azure AD B2C.
  4. Pilih Pendaftaran aplikasi, lalu pilih aplikasi yang Anda daftarkan di Langkah 2.3: Mendaftarkan aplikasi ponsel.
  5. Pilih Autentikasi.
  6. Di bawah Android, pilih Tambahkan URI.
  7. Masukkan Nama paket dan Tanda tangan hash.
  8. 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:

  1. Memperoleh token akses dengan izin yang diperlukan (cakupan) untuk titik akhir API web.
  2. 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:

  1. Mencoba untuk mengambil token akses dengan cakupan yang diminta dari cache token. Jika token hadir, token tersebut dikembalikan.
  2. Jika token tidak hadir dalam cache token, MSAL mencoba menggunakan token refresh untuk mendapatkan token baru.
  3. 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: