Обновление маркера доступа
Для внедрения и взаимодействия с содержимым Power BI (отчеты, панели мониторинга и плитки) требуется маркер доступа. Маркер доступа может бытьмаркером
Существует два способа обновления маркера доступа:
-
напрямую с помощью API
setAccessToken
- автоматически, если вы используете токен Azure AD для внедрения для вашей организации
Обновление маркера доступа напрямую
setAccessToken
можно использовать для обновления маркера доступа без перезагрузки внедренного отчета.
Используйте его, когда срок действия маркера истекает.
await report.setAccessToken(newAccessToken);
Пример обновления маркера вручную
Чтобы обновить маркер доступа вручную, реализуйте getNewUserAccessToken(). Эта функция вызывает серверную часть приложения для создания нового маркера внедрения или обновления маркера Azure AD.
Ниже приведен пример реализации функции getNewUserAccessToken() вручную, чтобы обновить маркер доступа до истечения срока действия.
const MINUTES_BEFORE_EXPIRATION = 10;
// Set the refresh interval time to 30 seconds
const INTERVAL_TIME = 30000;
// Get the token expiration from the access token
var tokenExpiration;
// Set an interval to check the access token expiration, and update if needed
setInterval(() => checkTokenAndUpdate(reportId, groupId), INTERVAL_TIME);
function checkTokenAndUpdate(reportId, groupId) {
// Get the current time
const currentTime = Date.now();
const expiration = Date.parse(tokenExpiration);
// Time until token expiration in milliseconds
const timeUntilExpiration = expiration - currentTime;
const timeToUpdate = MINUTES_BEFORE_EXPIRATION * 60 * 1000;
// Update the token if it is about to expired
if (timeUntilExpiration <= timeToUpdate)
{
console.log("Updating report access token");
updateToken(reportId, groupId);
}
}
async function updateToken(reportId, groupId) {
// Generate a new embed token or refresh the user Azure AD access token
let newAccessToken = await getNewUserAccessToken(reportId, groupId);
// Update the new token expiration time
tokenExpiration = newAccessToken.expiration;
// Get a reference to the embedded report HTML element
let embedContainer = $('#embedContainer')[0];
// Get a reference to the embedded report.
let report = powerbi.get(embedContainer);
// Set the new access token
await report.setAccessToken(newAccessToken.token);
}
// Add a listener to make sure token is updated after tab was inactive
document.addEventListener("visibilitychange", function() {
// Check the access token when the tab is visible
if (!document.hidden) {
checkTokenAndUpdate(reportId, groupId)
}
});
Автоматическое обновление маркера
Если вы используете маркер Azure AD для внедрения для вашей организации сценария, вы можете автоматически обновить маркер доступа, задав перехватчик событий в параметрах конфигурации внедрения. Перехватчик событий вызывает функцию, которая создает новые маркеры и назначает созданный маркер внедренным элементу до истечения срока действия текущего маркера. Все, что необходимо сделать, — предоставить функцию создания маркера, а остальные — автоматически.
Заметка
Автоматическое обновление маркера доступа поддерживается из библиотеки JavaScript powerbi-client версии 2.20.1.
Чтобы автоматически обновить маркер доступа, задайте функцию accessTokenProvider
в качестве параметра в IEmbedConfiguration
при внедрении. Эта функция реализуется клиентом и возвращает новый маркер при вызове.
После истечения срока действия маркера iframe вызовет accesTokenProvider
перехватчик, чтобы получить новый маркер из приложения размещения, а затем задать новый маркер.
Пример автоматического обновления маркера
Ниже приведен пример автоматического обновления маркера доступа до истечения срока его действия.
let getNewAccessToken = async function () {
// Code you need to add for generating new Azure AD token
return token;
};
let config = {
type: 'report',
tokenType: models.TokenType.Aad,
accessToken: “eyJ0 …”,
embedUrl: “https: …”,
eventHooks: {
accessTokenProvider: getNewAccessToken
}
};
// Get a reference to the embedded report HTML element
let embedContainer = $('#embedContainer')[0];
// Embed the report and display it within the div container.
report = powerbi.embed(embedContainer, config);
Рекомендации и ограничения
- Автоматическое обновление маркера доступа поддерживается только для сценария внедрения для вашей организации (данные пользователя).
- Перехватчик событий
accessTokenProvider
никогда не должен вызывать исключение. Если не удается создать новый маркер, верните значение NULL.