Поделиться через


Обновление маркера доступа

Для внедрения и взаимодействия с содержимым Power BI (отчеты, панели мониторинга и плитки) требуется маркер доступа. Маркер доступа может бытьмаркером Azure AD, при внедрении для вашей организации или маркера внедренияпри внедрении для клиентов. Маркер доступа имеет время окончания срока действия, что означает, что после внедрения элемента Power BI требуется ограниченное время для взаимодействия с ним. Чтобы предоставить пользователям непрерывный опыт, обновите (или продлить) маркер доступа до истечения срока его действия.

Существует два способа обновления маркера доступа:

Обновление маркера доступа напрямую

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.

Понимание различных решений внедрения