Tutorial: Menambahkan header kustom ke permintaan jaringan autentikasi asli di Android (Kotlin)

Berlaku untuk: Lingkaran hijau dengan simbol tanda centang putih yang menunjukkan konten berikut berlaku untuk penyewa eksternal. Penyewa eksternal (pelajari selengkapnya)

Tutorial ini menunjukkan cara melampirkan header x-* kustom ke permintaan jaringan autentikasi asli di aplikasi Android (Kotlin) Anda menggunakan antarmuka Pustaka Autentikasi Microsoft (MSAL) NativeAuthRequestInterceptor, memungkinkan integrasi dengan SDK penipuan dan deteksi bot pihak ketiga.

Di tutorial ini, Anda akan:

  • Pahami aturan penamaan header yang diberlakukan oleh MSAL.
  • Implementasikan NativeAuthRequestInterceptor antarmuka.
  • Daftarkan pencegat dengan konfigurasi aplikasi Anda.

Prasyarat

Memahami aturan penamaan header

MSAL menerapkan aturan berikut saat mengevaluasi header yang Anda berikan:

  • Header harus dimulai dengan x- (tidak peka huruf besar/kecil). Header yang tidak dimulai x- diabaikan.
  • Header yang dimulai dengan salah satu awalan cadangan berikut diabaikan:
    • x-client-
    • x-ms-
    • x-broker-
    • x-app-
  • Header yang valid dinormalisasi ke huruf kecil sebelum ditambahkan ke permintaan.
  • MSAL menambahkan header yang memenuhi kedua aturan ke permintaan jaringan. Jika header yang Anda berikan memiliki nama yang sama dengan salah satu header internal MSAL sendiri, nilai Anda lebih diutamakan.

Gunakan aturan ini untuk memverifikasi nama header yang disyaratkan oleh vendor Anda sebelum mengimplementasikan interceptor.

Menerapkan penyaring permintaan

Antarmuka NativeAuthRequestInterceptor mendeklarasikan satu metode yang dipanggil MSAL secara sinkron sebelum mengirim setiap permintaan jaringan. Implementasi Anda menerima URL permintaan dan mengembalikan peta header untuk ditambahkan, atau null jika tidak ada header yang diperlukan untuk permintaan tersebut.

Important

Metode ini additionalHeaders dijalankan secara sinkron pada utas yang melakukan permintaan (biasanya latar belakang/utas jaringan). Implementasi harus aman utas dan kembali dengan cepat. Setiap pengecualian yang dihasilkan dari metode ini diteruskan ke pemanggil dan menyebabkan permintaan gagal.

Buat kelas yang mengimplementasikan NativeAuthRequestInterceptor:

import com.microsoft.identity.common.java.nativeauth.providers.NativeAuthRequestInterceptor
import java.net.URL

class CustomHeaderInterceptor : NativeAuthRequestInterceptor {

    override fun additionalHeaders(requestUrl: URL): Map<String, String>? {
        // Scope headers to specific endpoints only.
        if (requestUrl.path.contains("oauth2/v2.0/initiate")) {
            return mapOf(
                "value_1" to "customer_header_1",          // Ignored: doesn't start with "x-"
                "x-client-header" to "customer_header_2",  // Ignored: starts with reserved prefix "x-client-"
                "X-my-custom-header" to "my data"          // Added to the network request (lowercased to "x-my-custom-header").
            )
        }

        // Return null for all other requests to avoid over-sending signals.
        return null
    }
}

Metode ini menerima URL lengkap permintaan keluar di requestUrl. Gunakan URL ini untuk membatasi header Anda ke endpoint tertentu yang diperlukan oleh vendor deteksi penipuan atau bot, seperti endpoint untuk memulai proses masuk atau pendaftaran. Mengirim header ke titik akhir yang tidak terkait dapat menurunkan kualitas sinyal dan meningkatkan positif palsu.

Note

Selalu kembalikan nilai dari additionalHeaders. Mengembalikan null atau peta kosong jika tidak ada header tambahan yang diperlukan untuk permintaan tersebut.

Daftarkan pencegat

Setelah menerapkan antarmuka, atur requestInterceptor properti di aplikasi NativeAuthPublicClientApplicationConfigurationAnda. Jika aplikasi Anda menginisialisasi klien autentikasi dengan file konfigurasi JSON (seperti app/src/main/res/raw/native_auth_sample_app_config.json), atur pencegat pada konfigurasi setelah membuat klien:

import com.microsoft.identity.client.PublicClientApplication
import com.microsoft.identity.nativeauth.INativeAuthPublicClientApplication
import com.microsoft.identity.nativeauth.NativeAuthPublicClientApplicationConfiguration

val authClient: INativeAuthPublicClientApplication =
    PublicClientApplication.createNativeAuthPublicClientApplication(
        context,
        R.raw.native_auth_sample_app_config
    )

(authClient as? PublicClientApplication)?.let { app ->
    (app.configuration as? NativeAuthPublicClientApplicationConfiguration)?.requestInterceptor =
        CustomHeaderInterceptor()
}

Jika aplikasi Anda menggunakan konfigurasi terprogram, atur properti requestInterceptor pada instance NativeAuthPublicClientApplicationParameters Anda sebelum membuat aplikasi:

import com.microsoft.identity.client.PublicClientApplication
import com.microsoft.identity.nativeauth.INativeAuthPublicClientApplication
import com.microsoft.identity.nativeauth.NativeAuthPublicClientApplicationParameters

val parameters = NativeAuthPublicClientApplicationParameters(
    clientId = "Enter_the_Application_Id_Here",
    authorityUrl = "https://Enter_the_Tenant_Subdomain_Here.ciamlogin.com/Enter_the_Tenant_Subdomain_Here.onmicrosoft.com/",
    challengeTypes = listOf("oob", "password")
)
parameters.requestInterceptor = CustomHeaderInterceptor()

val authClient: INativeAuthPublicClientApplication =
    PublicClientApplication.createNativeAuthPublicClientApplication(
        context,
        parameters
    )

Pastikan apakah header sudah diterapkan

Untuk mengonfirmasi bahwa header Anda mencapai titik akhir yang dimaksudkan, periksa lalu lintas jaringan keluar menggunakan alat proksi jaringan seperti Charles Proxy atau Android Studio Network Inspector. Periksa apakah:

  • Header yang dimulai dengan x- dan tanpa awalan yang dicadangkan muncul dalam permintaan HTTP.
  • Header dengan awalan yang dipesan (x-client-, x-ms-, x-broker-, x-app-) tidak muncul dalam permintaan.
  • Header dikirim hanya ke titik akhir yang Anda cakup.
  • Nama header yang valid ditulis dalam huruf kecil dalam permintaan yang dikirim.

Note

Pencatatan log di dalam interceptor tidak akan menampilkan header akhir permintaan. Interceptor dipanggil sebelum MSAL mengevaluasi dan menerapkan aturan penamaan, sehingga hanya mencerminkan header yang Anda sediakan, bukan yang pada akhirnya dikirim.