刷新访问令牌

嵌入和与 Power BI 内容(报表、仪表板和磁贴)交互需要访问令牌。 在为组织嵌入时,访问令牌可以是 Azure AD 令牌,也可以在为客户嵌入时 嵌入令牌。 访问令牌具有过期时间,这意味着在嵌入 Power BI 项后,可以有有限的时间来与之交互。 若要为用户提供持续体验,请在访问令牌过期之前刷新(或续订)。

有两种方法可以刷新访问令牌:

  • 使用 setAccessToken API 直接
  • 如果为组织使用 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 令牌,则可以通过在嵌入配置参数中设置事件挂钩来自动刷新访问令牌。 事件挂钩将调用一个函数,该函数生成新令牌,并将生成的令牌分配给嵌入项,然后当前令牌过期。 只需提供令牌生成函数,其余操作会自动发生。

注意

Powerbi-client JavaScript 库版本 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 值。

了解不同的嵌入解决方案