Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Перед началом работы убедитесь, что вы узнаете, как войти в систему и получить маркеры.
При использовании MSAL.js следует понимать, что влечет за собой получение токенов для пользователей, и как управлять сроком действия этих токенов.
Время существования токена и срок действия
Вы можете настроить время существования токенов доступа, идентификации или токенов Security Assertion Markup Language (SAML), выдаваемых платформой идентификации Майкрософт. Ниже приведены некоторые сведения.
Токены идентификации
Токены идентификации привязаны к конкретной комбинации учетной записи и клиента и обычно содержат информацию о профиле пользователя. Как правило, время жизни сеанса пользователя веб-приложения обычно совпадает со временем жизни сеанса токена ID, которое по умолчанию составляет 24 часа. Дополнительные сведения см. в статье о настройке времени существования маркеров.
Токены доступа
Маркеры доступа в браузере имеют рекомендуемый срок действия по умолчанию 1 час. Через этот 1 час все вызовы носителя с истекшим сроком действия будут отклонены. Этот токен можно незаметно обновить с помощью токена обновления, полученного с использованием этого токена. Вы можете подробнее узнать о настройке сроков действия токенов.
Маркеры обновления
Токены обновления, предоставляемые одностраничным приложениям, имеют ограниченный срок действия (обычно 24 часа с момента получения). Это неизменяемое, нескользящее окно, время существования. Каждый раз, когда токен обновления используется для обновления токена доступа, вместе с обновлённым токеном доступа выдается новый токен обновления. Этот новый маркер обновления будет иметь время существования, равное оставшейся жизни исходного маркера обновления. После истечения срока действия маркера обновления необходимо инициировать новый поток кода авторизации, чтобы получить код авторизации и обменять его на новый набор маркеров.
Примечание. При получении нового маркера обновления msal.js заменяет кэшированный маркер обновления новым маркером обновления, однако старый маркер обновления не является недействительным сервером и по-прежнему может использоваться для получения маркеров доступа до истечения срока его действия.
Продление токена
Объект PublicClientApplication предоставляет API с именем acquireTokenSilent, предназначенный для незаметного получения токена с неистёкшим сроком действия. Это делается в нескольких шагах:
- Проверьте, существует ли маркер в кэше маркеров для заданного
scopes,client idиauthority/илиhomeAccountIdentifier. - Если для заданных параметров существует токен, убедитесь, что найдено только одно совпадение, и проверьте срок его действия.
- Если маркер доступа не истек, MSAL вернет ответ с соответствующими маркерами.
- Если срок действия маркера доступа истек, но маркер обновления по-прежнему действителен, MSAL будет использовать заданный маркер обновления для получения нового набора маркеров, а затем возвратить ответ.
- Если срок действия маркера обновления истёк, MSAL попытается получить маркер доступа в фоновом режиме с помощью скрытого iframe. Это позволит использовать идентификатор безопасности или имя пользователя в объекте утверждений учетной записи для получения указания о сеансе пользователя. Если этот вызов в скрытом iframe завершится с ошибкой, MSAL передаст ошибку от сервера как
InteractionRequiredAuthError, указывая на необходимость получить код авторизации, чтобы получить новый набор токенов. Это можно сделать, выполнив вызов API login или acquireToken с объектомPublicClientApplication. Если сеанс по-прежнему активен, сервер отправит код без каких-либо запросов пользователя. В противном случае пользователю потребуется ввести свои учетные данные.
Дополнительные сведения о параметрах конфигурации, которые можно задать для метода, см. в статье о объектах запроса и ответовacquireTokenSilent.
Избегайте интерактивных прерываний в середине сеанса пользователя
В некоторых случаях может потребоваться заранее инициировать взаимодействие (при необходимости) в начале сеанса пользователя, чтобы он мог и дальше получать токены без вмешательства пользователя и использовать приложение без дополнительных прерываний. Конечно, этого можно добиться, вызывая интерактивный вход каждый раз при первой загрузке приложения, однако это ухудшает пользовательский опыт и снижает производительность, если у пользователя уже есть токены из предыдущего сеанса или из другого окна/вкладки. Вместо этого, используя несколько параметров запроса, вы можете использовать acquireTokenSilent, чтобы гарантировать, что в кэше имеются необходимые токены и их можно будет незаметно вернуть в течение произвольного периода времени.
Чтобы гарантировать, что acquireTokenSilent может возвращать действительные токены как минимум в течение 1 часа:
- Вызовите
acquireTokenSilentпри загрузке страницы с параметром запросаforceRefresh, установленным в значениеtrue. Это позволит обойти кэш и получить новый токен, который затем может возвращаться из кэша при последующих вызовах. - При последующих вызовах оставьте
forceRefreshнезаданным или явно укажитеfalse, чтобы токены могли браться из кэша.
Чтобы убедиться, что acquireTokenSilent может возвращать действительные токены в течение как минимум любого периода времени вплоть до 24 часов:
- Вызывайте
acquireTokenSilentпри загрузке страницы, установив для параметра запросаforceRefreshзначениеtrue, а для параметраrefreshTokenExpirationOffsetSeconds— требуемую длительность (в секундах), в течение которой не должно быть взаимодействия с пользователем. - При последующих вызовах оставьте
forceRefreshиrefreshTokenExpirationOffsetSecondsнезаданными, чтобы токены могли выдаваться из кэша.
Например, если вы хотите убедиться, что пользователь может получать токены в фоновом режиме в течение следующих 2 часов:
var request = {
scopes: ["Mail.Read"],
account: currentAccount,
forceRefresh: true,
refreshTokenExpirationOffsetSeconds: 7200 // 2 hours * 60 minutes * 60 seconds = 7200 seconds
};
const tokenResponse = await msalInstance.acquireTokenSilent(request).catch(async (error) => {
if (error instanceof InteractionRequiredAuthError) {
// fallback to interaction when silent call fails
await msalInstance.acquireTokenRedirect(request);
}
});
Примечание. Никогда не существует гарантии того, что маркер можно получить автоматически, даже если срок действия маркера обновления еще не истек. Описанные выше шаблоны — это лучшие попытки свести к минимуму взаимодействие в неудобные времена, но не устраняют возможность необходимых взаимодействий в течение требуемых периодов времени. Кроме того, не все поставщики удостоверяющих данных возвращают срок действия токена обновления — в таких случаях параметр запроса refreshTokenExpirationOffsetSeconds не будет учитываться.
Политика поиска кэша
При необходимости в запросе можно указать политику поиска в кэше. Политики поиска в кэше:
-
CacheLookupPolicy.Default-acquireTokenSilentпопытается получить маркер доступа из кэша. Если срок действия маркера доступа истек или маркер доступа не удается найти, для получения нового будет использован маркер обновления. И наконец, если срок действия маркера обновления истёк,acquireTokenSilentпопытается в фоновом режиме получить новый маркер доступа, ID-токен и маркер обновления. -
CacheLookupPolicy.AccessToken-acquireTokenSilentбудет искать только маркеры доступа в кэше. Он не попытается продлить доступ или обновить маркеры. -
CacheLookupPolicy.AccessTokenAndRefreshToken-acquireTokenSilentпопытается получить маркер доступа из кэша. Если срок действия маркера доступа истек или не найден, маркер обновления будет использоваться для получения нового. Если срок действия маркера обновления истек, он не будет обновлен, иacquireTokenSilentзавершится ошибкой. -
CacheLookupPolicy.RefreshToken-acquireTokenSilentне попытается получить маркеры доступа из кэша и вместо этого попытается обменять кэшированный маркер обновления на новый маркер доступа. Если срок действия маркера обновления истек, он не будет продлен, иacquireTokenSilentне удастся выполнить. -
CacheLookupPolicy.RefreshTokenAndNetwork-acquireTokenSilentне будет искать маркер доступа в кэше. Он перейдет непосредственно в сеть с кэшируемым маркером обновления. Если срок действия маркера обновления истекает, будет предпринята попытка продлить его. Это эквивалентно настройкеforceRefresh: true. -
CacheLookupPolicy.Skip-acquireTokenSilentпопытается обновить как токен доступа, так и токен обновления. Он не будет выглядеть в кэше. Это всегда завершится ошибкой, если сторонние файлы cookie заблокированы браузером.
Фрагменты кода
Popup
var username = "test@contoso.com";
var currentAccount = msalInstance.getAccount({ username });
var silentRequest = {
scopes: ["Mail.Read"],
account: currentAccount,
forceRefresh: false,
cacheLookupPolicy: CacheLookupPolicy.Default // will default to CacheLookupPolicy.Default if omitted
};
var request = {
scopes: ["Mail.Read"],
loginHint: currentAccount.username // For v1 endpoints, use upn from idToken claims
};
const tokenResponse = await msalInstance.acquireTokenSilent(silentRequest).catch(async (error) => {
if (error instanceof InteractionRequiredAuthError) {
// fallback to interaction when silent call fails
return await msalInstance.acquireTokenPopup(request).catch(error => {
if (error instanceof InteractionRequiredAuthError) {
// fallback to interaction when silent call fails
return msalInstance.acquireTokenRedirect(request)
}
});
}
});
Перенаправить
var username = "test@contoso.com";
var currentAccount = msalInstance.getAccount({ username });
var silentRequest = {
scopes: ["Mail.Read"],
account: currentAccount,
forceRefresh: false,
cacheLookupPolicy: CacheLookupPolicy.Default // will default to CacheLookupPolicy.Default if omitted
};
var request = {
scopes: ["Mail.Read"],
loginHint: currentAccount.username // For v1 endpoints, use upn from idToken claims
};
const tokenResponse = await msalInstance.acquireTokenSilent(silentRequest).catch(error => {
if (error instanceof InteractionRequiredAuthError) {
// fallback to interaction when silent call fails
return msalInstance.acquireTokenRedirect(request)
}
});
Дальнейшие шаги
Узнайте, как выполнить выход из системы.