共用方式為


重新整理存取令牌

內嵌和與 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 令牌,則可以在內嵌組態參數中設定事件勾點,自動重新整理存取令牌。 事件攔截會呼叫產生新令牌的函式,並在目前令牌到期之前,將產生的令牌指派給內嵌專案。 您只需要提供令牌產生函式,其餘作業就會自動發生。

注意

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 值。

瞭解不同的內嵌解決方案