Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: арендаторы рабочей силы
внешние арендаторы (подробнее)
Шаблон для получения токенов для API с помощью MSAL.js состоит в том, чтобы сначала попытаться выполнить тихий запрос токена с помощью метода acquireTokenSilent
. При вызове этого метода библиотека сначала проверяет кэш в хранилище браузера, чтобы узнать, существует ли маркер доступа без истечения срока действия и возвращает его. Если маркер доступа не найден или срок действия маркера доступа истек, он пытается использовать его маркер обновления для получения нового маркера доступа. Если срок действия токена обновления 24 часа также истек, MSAL.js открывает невидимый iframe для автоматического запроса нового кода авторизации с использованием существующего активного сеанса с Microsoft Entra ID (если таковой имеется), который затем будет обменен на новый набор токенов (токены доступа и обновления).
Дополнительные сведения о сеансе единого входа и значениях времени существования токена в идентификаторе Microsoft Entra см. в разделе "Время существования токенов". Дополнительные сведения о политике поиска кэша MSAL.js см. в разделе "Получение токена доступа".
Запросы "тихого" маркера к идентификатору Microsoft Entra ID могут завершиться ошибкой по таким причинам, как изменение пароля или обновленные политики условного доступа. Чаще всего сбои связаны с тем, что истек 24-часовой срок существования маркера обновления и браузер блокирует сторонние файлы cookie, что предотвращает использование скрытых окон iframe для продолжения проверки подлинности пользователя. В этих случаях следует вызвать один из интерактивных методов, который может запросить у пользователя токены.
-
Всплывающее окно, используя
acquireTokenPopup
. -
Перенаправление, используя
acquireTokenRedirect
.
Выберите между всплывающим окном или перенаправлением
Выбор между методами всплывающего окна и перенаправления зависит от логики работы приложения:
- Если вы не хотите, чтобы пользователи переходили со страницы основного приложения во время проверки подлинности, рекомендуем использовать метод всплывающего окна. Так как перенаправление проверки подлинности происходит во всплывающем окне, состояние основного приложения сохраняется.
- Если у пользователей есть ограничения браузера или политики, где отключены всплывающие окна, можно использовать метод перенаправления. Используйте метод перенаправления в браузере Internet Explorer, так как существуют известные проблемы со всплывающими окнами в Internet Explorer.
Можно задать области API, которые должен включать токен доступа при создании запроса токена доступа. Не все запрошенные области могут быть включены в маркер доступа. Это зависит от согласия пользователя.
Получение токена с помощью всплывающего окна
Следующий код объединяет ранее описанный шаблон с методами для всплывающего окна:
import {
InteractionRequiredAuthError,
InteractionStatus,
} from "@azure/msal-browser";
import { AuthenticatedTemplate, useMsal } from "@azure/msal-react";
function ProtectedComponent() {
const { instance, inProgress, accounts } = useMsal();
const [apiData, setApiData] = useState(null);
useEffect(() => {
if (!apiData && inProgress === InteractionStatus.None) {
const accessTokenRequest = {
scopes: ["user.read"],
account: accounts[0],
};
instance
.acquireTokenSilent(accessTokenRequest)
.then((accessTokenResponse) => {
// Acquire token silent success
let accessToken = accessTokenResponse.accessToken;
// Call your API with token
callApi(accessToken).then((response) => {
setApiData(response);
});
})
.catch((error) => {
if (error instanceof InteractionRequiredAuthError) {
instance
.acquireTokenPopup(accessTokenRequest)
.then(function (accessTokenResponse) {
// Acquire token interactive success
let accessToken = accessTokenResponse.accessToken;
// Call your API with token
callApi(accessToken).then((response) => {
setApiData(response);
});
})
.catch(function (error) {
// Acquire token interactive failure
console.log(error);
});
}
console.log(error);
});
}
}, [instance, accounts, inProgress, apiData]);
return <p>Return your protected content here: {apiData}</p>;
}
function App() {
return (
<AuthenticatedTemplate>
<ProtectedComponent />
</AuthenticatedTemplate>
);
}
В качестве альтернативы, если вам необходимо получить маркер вне компонента React, вы можете вызвать acquireTokenSilent
, но не должны возвращаться к взаимодействию в случае сбоя. Все взаимодействие в дереве компонентов должно происходить ниже компонента MsalProvider
.
// MSAL.js v2 exposes several account APIs, logic to determine which account to use is the responsibility of the developer
const account = publicClientApplication.getAllAccounts()[0];
const accessTokenRequest = {
scopes: ["user.read"],
account: account,
};
// Use the same publicClientApplication instance provided to MsalProvider
publicClientApplication
.acquireTokenSilent(accessTokenRequest)
.then(function (accessTokenResponse) {
// Acquire token silent success
let accessToken = accessTokenResponse.accessToken;
// Call your API with token
callApi(accessToken);
})
.catch(function (error) {
//Acquire token silent failure
console.log(error);
});
Получение токена с помощью перенаправления
Если в acquireTokenSilent
происходит сбой, вернитесь к acquireTokenRedirect
. Этот метод инициирует перенаправление на весь экран, а ответ будет обрабатываться при возврате к приложению. Когда этот компонент отображается после возврата из перенаправления, acquireTokenSilent
теперь должен быть выполнен успешно, поскольку токены будут извлечены из кэша.
import {
InteractionRequiredAuthError,
InteractionStatus,
} from "@azure/msal-browser";
import { AuthenticatedTemplate, useMsal } from "@azure/msal-react";
function ProtectedComponent() {
const { instance, inProgress, accounts } = useMsal();
const [apiData, setApiData] = useState(null);
useEffect(() => {
const accessTokenRequest = {
scopes: ["user.read"],
account: accounts[0],
};
if (!apiData && inProgress === InteractionStatus.None) {
instance
.acquireTokenSilent(accessTokenRequest)
.then((accessTokenResponse) => {
// Acquire token silent success
let accessToken = accessTokenResponse.accessToken;
// Call your API with token
callApi(accessToken).then((response) => {
setApiData(response);
});
})
.catch((error) => {
if (error instanceof InteractionRequiredAuthError) {
instance.acquireTokenRedirect(accessTokenRequest);
}
console.log(error);
});
}
}, [instance, accounts, inProgress, apiData]);
return <p>Return your protected content here: {apiData}</p>;
}
function App() {
return (
<AuthenticatedTemplate>
<ProtectedComponent />
</AuthenticatedTemplate>
);
}
В качестве альтернативы, если вам необходимо получить маркер вне компонента React, вы можете вызвать acquireTokenSilent
, но не должны возвращаться к взаимодействию в случае сбоя. Все взаимодействие в дереве компонентов должно происходить ниже компонента MsalProvider
.
// MSAL.js v2 exposes several account APIs, logic to determine which account to use is the responsibility of the developer
const account = publicClientApplication.getAllAccounts()[0];
const accessTokenRequest = {
scopes: ["user.read"],
account: account,
};
// Use the same publicClientApplication instance provided to MsalProvider
publicClientApplication
.acquireTokenSilent(accessTokenRequest)
.then(function (accessTokenResponse) {
// Acquire token silent success
let accessToken = accessTokenResponse.accessToken;
// Call your API with token
callApi(accessToken);
})
.catch(function (error) {
//Acquire token silent failure
console.log(error);
});