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

Перед получением маркера доступа убедитесь, что вы узнаете, как инициализировать объект приложения. Кроме того, важно понимать связь между маркерами доступа и ресурсами.

В MSAL можно получать маркеры доступа для API, которые должно вызывать ваше приложение, с помощью методов acquireToken*, предоставляемых библиотекой. Методы acquireToken* скрывают 2 шага, необходимых для получения токенов в потоке кода авторизации OAuth 2.0:

  1. отправить запрос в Microsoft Entra ID, чтобы получить authorization code
  2. обменять этот код на токен доступа, содержащий области действия, на которые пользователь дал согласие

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

Выбор типа взаимодействия

См. здесь , если вы не уверены в различиях между acquireTokenRedirect и acquireTokenPopup.

Подготовка объекта запроса

Необходимо передать объект acquireToken* запроса в API. Этот объект позволяет использовать различные параметры в запросе. Дополнительные сведения о параметрах объекта запроса см. здесь . Области действия обязательны для всех вызовов acquireToken*.

Проверка кэша

MSAL использует кэш для хранения токенов в зависимости от определенных параметров, включая области действия, ресурс и центр авторизации, и при необходимости извлекает токен из кэша. Он также может выполнять тихое обновление этих токенов после истечения срока их действия. MSAL предоставляет эту функцию с помощью acquireTokenSilent метода.

После входа в систему с помощью одного из API ssoSilent или login* кэш будет содержать набор токенов идентификатора, доступа и обновления. Каждый раз, когда вам нужен токен доступа, следует вызывать acquireTokenSilent, а если это не удастся, вместо этого вызвать интерактивный API. acquireTokenSilent будет искать допустимый маркер в кэше, и если он близок к истечению срока действия или не существует, автоматически попытается обновить его для вас с помощью кэшированного маркера обновления. Дополнительные сведения об использовании acquireTokenSilent см. здесь.

var request = {
    scopes: ["User.Read"],
};

msalInstance.acquireTokenSilent(request).then(tokenResponse => {
    // Do something with the tokenResponse
}).catch(async (error) => {
    if (error instanceof InteractionRequiredAuthError) {
        // fallback to interaction when silent call fails
        return msalInstance.acquireTokenPopup(request);
    }

    // handle other errors
})

Перенаправить

var request = {
    scopes: ["User.Read"],
};

msalInstance.acquireTokenSilent(request).then(tokenResponse => {
    // Do something with the tokenResponse
}).catch(error => {
    if (error instanceof InteractionRequiredAuthError) {
        // fallback to interaction when silent call fails
        return msalInstance.acquireTokenRedirect(request)
    }

    // handle other errors
});

Использование токена доступа

После получения маркера доступа необходимо включить его в заголовок в Authorization качестве маркера носителя для запроса к ресурсу, для которого вы получили маркер, как показано ниже:

var headers = new Headers();
var bearer = "Bearer " + tokenResponse.accessToken;
headers.append("Authorization", bearer);
var options = {
        method: "GET",
        headers: headers
};
var graphEndpoint = "https://graph.microsoft.com/v1.0/me";

fetch(graphEndpoint, options)
    .then(resp => {
        //do something with response
    });

Рекомендации по получению токенов MSAL

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

Используйте один экземпляр PublicClientApplication

Создайте один экземпляр PublicClientApplication для каждого приложения и используйте этот же экземпляр во всем приложении. Это гарантирует наличие единого достоверного источника информации о том, что MSAL выполняет в каждый конкретный момент времени (см. события MSAL), и исключает возможность того, что разные объекты приложения будут выполнять параллельные интерактивные запросы, а также возникновения возможных конфликтов в кэше, которые могут нарушить работу приложений, снизить производительность или ухудшить пользовательский опыт.

Всегда дождитесь разрешения обещаний

Все MSAL acquireToken* , а также login* API выполняют асинхронные операции и обещания возврата. Всегда дожидайтесь завершения этих промисов, прежде чем выполнять любые другие задачи, зависящие от состояния аутентификации или токенов, например отображение информации о пользователе, вызов защищённого API или вызов других API MSAL.

Сначала попробуйте выполнить тихий запрос, а затем интерактивный

При запросе токенов всегда сначала используйте acquireTokenSilent, при необходимости переходя к интерактивному получению токенов (например, при возникновении InteractionRequiredAuthError).

Разрешены одновременные тихие запросы. Если одновременно выполняются два или более тихих запроса, только один из них будет отправлен по сети (при необходимости), но ответ получат все, если эти запросы используют одни и те же параметры запроса (например, области действия).

Одновременные интерактивные запросы не разрешены. Если одновременно выполняются два или более интерактивных запроса, только первый начнет взаимодействие, а остальные завершаются ошибкой interaction_in_progress . Мы рекомендуем ознакомиться с этой ошибкой и возможными способами ее устранения, чтобы не столкнуться с ней в ваших приложениях.

Создание одного запроса токена на ресурс

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

Дальнейшие шаги