Руководство. Вызов API в приложении Android с помощью собственной проверки подлинности

Применяется: зеленый круг с символом белой галочки, указывающим, что следующее содержимое применяется к внешним клиентам. Внешние клиенты (дополнительные сведения)

В этом руководстве вы узнаете, как получить маркер доступа и вызвать API в мобильном приложении Android. Родной SDK аутентификации Microsoft Authentication Library (MSAL) для Android позволяет получить несколько токенов доступа с помощью единого входа. Эта возможность позволяет получить один или несколько маркеров доступа, не требуя повторной проверки подлинности пользователя.

Изучив это руководство, вы:

  • Получите один или несколько токенов доступа.
  • Вызов API

Необходимые условия

Получить токен доступа

После входа пользователя вы получите токен доступа, указав области, для которых он действителен.

Пакет SDK для собственной проверки подлинности MSAL поддерживает несколько маркеров доступа, поэтому можно указать несколько наборов областей, а затем запросить маркер доступа для каждого набора областей:

  1. Объявите и задайте значения для набора областей API с помощью следующего фрагмента кода:

    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. Войдите в систему с помощью следующего фрагмента кода:

    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. Получите один или несколько маркеров доступа с помощью следующего фрагмента кода:

    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 
            }
        }
    }   
    
    

    Определите функцию getAccessToken(), как показано в следующем коде:

    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")
        }
    }
    

Вызов API

Чтобы выполнить вызов API, используйте маркер доступа, полученный в Получить маркер доступа и URL-адрес API:

  1. Объявите и задайте значения ДЛЯ URL-адресов API с помощью следующего фрагмента кода:

    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" 
    }
    

    Замените:

    • Enter_URL_Of_First_Web_API плейсхолдер с полным значением URL-адреса вашего первого API.
    • Enter_URL_Of_Second_Web_API заполнитель с полным значением URL-адреса вашего второго API.
  2. Используйте следующие фрагменты кода для вызова 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)
        }
    }
    

    Определите функцию performGetApiRequest(), как показано в следующем коде:

    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 }
        }
    }
    

Настройка настраиваемого поставщика утверждений

Если вы хотите добавить утверждения из внешней системы в токен, выданный вашему приложению, используйте настраиваемый поставщик утверждений. Настраиваемый поставщик утверждений состоит из настраиваемого расширения проверки подлинности, вызывающего внешний REST API для получения утверждений из внешних систем.

Выполните действия, описанные в "Настройка пользовательского поставщика утверждений", для добавления утверждений из внешней системы в ваши токены безопасности.