Tutorial: Memanggil API di aplikasi Android dengan menggunakan autentikasi asli

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

Dalam tutorial ini, Anda mempelajari cara memperoleh token akses dan memanggil API di aplikasi seluler Android Anda. SDK autentikasi asli Microsoft Authentication Library (MSAL) untuk Android memungkinkan Anda memperoleh beberapa token akses dengan satu masuk. Kemampuan ini memungkinkan Anda memperoleh satu atau beberapa token akses tanpa mengharuskan pengguna untuk mengautentikasi ulang.

Di tutorial ini, Anda akan:

  • Memperoleh satu atau beberapa token akses.
  • Memanggil sebuah API

Prasyarat

Memperoleh token akses

Setelah pengguna masuk, Anda memperoleh token akses dengan menentukan cakupan yang token aksesnya valid.

SDK autentikasi asli MSAL mendukung beberapa token akses, sehingga Anda dapat menentukan beberapa set cakupan, lalu meminta token akses untuk setiap set cakupan:

  1. Deklarasikan dan tetapkan nilai untuk sekumpulan cakupan API dengan menggunakan cuplikan kode berikut:

    companion object {
        // Set values for respective API scopes for their web API resources here, for example: ["api://<Resource_App_ID>/ToDoList.Read", "api://<Resource_App_ID>/ToDoList.ReadWrite"]
        // A list of scope for API 1
        private val scopesForAPI1 = listOf<String>()
        // A list of scope for API 2
        private val scopesForAPI2 = listOf<String>()
    }
    
  2. Melakukan login pengguna dengan menggunakan cuplikan kode berikut:

    CoroutineScope(Dispatchers.Main).launch {
        val parameters = NativeAuthSignInParameters(username = email)
        parameters.password = password
        val actionResult: SignInResult = authClient.signIn(parameters)
    
        if (actionResult is SignInResult.Complete) -> {
            // Perform operations after successful sign-in
        } else if (actionResult is SignInError) {
            // Handle sign-in errors
        }
    }
    
  3. Dapatkan satu atau beberapa token akses dengan menggunakan cuplikan kode berikut:

    CoroutineScope(Dispatchers.Main).launch {
        val accountResult = authClient.getCurrentAccount()
        when (accountResult) {
            is GetAccountResult.AccountFound -> {
                try {
                    // Access token for API 1
                    val accessTokenOne = getAccessToken(accountResult.resultValue, scopesForAPI1)
                    // Access token for API 2
                    val accessTokenTwo = getAccessToken(accountResult.resultValue, scopesForAPI2)
                    // Proceed to make a call to an API
                } catch (e: Exception) {
                    // Handle Exception
                }
            }
            is GetAccountResult.NoAccountFound -> {
                // Handle etAccountResult.NoAccountFound
            }
            is GetAccountError -> {
                // Handle GetAccountError 
            }
        }
    }   
    
    

    Tentukan fungsi getAccessToken() seperti yang ditunjukkan dalam kode berikut:

    private suspend fun getAccessToken(accountState: AccountState, scopes: List<String>): String {
        val parameters = NativeAuthGetAccessTokenParameters()
        parameters.scopes = scopes
        val accessTokenState = accountState.getAccessToken(parameters)
    
        return if (accessTokenState is GetAccessTokenResult.Complete) {
            accessTokenState.resultValue.accessToken
        } else {
            throw Exception("Failed to get access token")
        }
    }
    

Memanggil sebuah API

Untuk melakukan panggilan API, gunakan token akses yang Anda peroleh di Memperoleh token akses dan URL API:

  1. Deklarasikan dan tetapkan nilai untuk URL API dengan menggunakan cuplikan kode berikut:

    companion object {
        // Set values for respective API scopes for web API resources here, for example: ["api://<Resource_App_ID>/ToDoList.Read", "api://<Resource_App_ID>/ToDoList.ReadWrite"]
        // A list of scope for API 1
        private val scopesForAPI1 = listOf<String>()
        // A list of scope for API 2
        private val scopesForAPI2 = listOf<String>()
        // Set the URL of first web API resource here
        private const val WEB_API_URL_1 = "Enter_URL_Of_First_Web_API" 
        // Set the URL of second web API resource here
        private const val WEB_API_URL_2 = "Enter_URL_Of_Second_Web_API" 
    }
    

    Ganti:

    • Enter_URL_Of_First_Web_API placeholder dengan nilai URL lengkap dari API pertama Anda.
    • Enter_URL_Of_Second_Web_API tempat penampung dengan nilai URL lengkap API kedua Anda.
  2. Gunakan cuplikan kode berikut untuk memanggil API:

    // After you acquire an access token, use it to call an API
    
    val firstApiResponse = useAccessToken(WEB_API_URL_1, accessTokenOne)
    val secondApiResponse = useAccessToken(WEB_API_URL_2, accessTokenTwo)
    
    private suspend fun useAccessToken(WEB_API_URL: String, accessToken: String): Response {
        return withContext(Dispatchers.IO) {
            ApiClient.performGetApiRequest(WEB_API_URL, accessToken)
        }
    }
    

    Tentukan fungsi performGetApiRequest() seperti yang ditunjukkan dalam kode berikut:

    object ApiClient {
        private val client = OkHttpClient()
    
        fun performGetApiRequest(WEB_API_URL: String, accessToken: String): Response {    
            val requestBuilder = Request.Builder()
                    .url(WEB_API_URL)
                    .addHeader("Authorization", "Bearer $accessToken")
                    .get()
    
            val request = requestBuilder.build()
    
            client.newCall(request).execute().use { response -> return response }
        }
    }
    

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 token keamanan Anda.