重新整理存取令牌
內嵌和與 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)
}
});
自動重新整理令牌
如果您針對組織 案例的
注意
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 值。