刷新访问令牌
嵌入和与 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 值。