You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发自定义Power BI视觉对象:如何不依赖Localstorage存储会话数据?

Power BI自定义视觉OAuth2令牌存储解决方案

Power BI自定义视觉运行在沙箱环境中,普通localStorage/sessionStorage/Cookie会被沙箱策略拦截,这就是你尝试后无效的核心原因。结合你的需求(用户专属令牌、无需认证发布流程),以下是几个可行方案:

方案1:用Power BI内置StorageService(推荐)

这是官方为自定义视觉提供的用户级存储方案,数据绑定当前Power BI用户,无需额外发布流程,完全匹配你的场景。

实现步骤

  1. 在视觉构造函数中注入IVisualHost,获取storageService实例
  2. 存储令牌时指定StorageType.User,确保数据和用户账号绑定
  3. 读取时直接从用户存储中加载

TypeScript示例代码

import { IVisualHost, StorageType } from "powerbi-visuals-api";

export class CustomVisual implements IVisual {
    private host: IVisualHost;
    private readonly tokenStorageKey = "thirdParty_oauth_token";

    constructor(options: VisualConstructorOptions) {
        this.host = options.host;
    }

    // 存储加密后的令牌
    saveAuthToken(encryptedToken: string): void {
        this.host.storageService.store(this.tokenStorageKey, encryptedToken, StorageType.User);
    }

    // 读取令牌
    getAuthToken(): string | null {
        return this.host.storageService.load(this.tokenStorageKey, StorageType.User) as string || null;
    }
}

方案2:内存临时存储(单次会话)

如果只需要当前报表会话内有效,不需要跨会话持久化,直接在视觉实例中用变量存储即可。这种方式零配置,但刷新或关闭报表后令牌会丢失,需重新认证。

示例代码

export class CustomVisual implements IVisual {
    private currentAuthToken: string | null = null;

    // 设置令牌
    setCurrentToken(token: string): void {
        this.currentAuthToken = token;
    }

    // 获取令牌
    getCurrentToken(): string | null {
        return this.currentAuthToken;
    }
}

方案3:用户级书签存储(进阶)

如果需要跨会话持久化且StorageService满足不了需求,可将令牌编码后存入Power BI用户级书签(仅当前用户可见)。步骤稍繁琐,优先级低于方案1:

  • 将令牌转为Base64编码(规避特殊字符)
  • 创建/更新用户级书签,把编码后的令牌作为自定义属性存入
  • 打开报表时读取用户书签的自定义属性,解码后恢复令牌

重要提醒

  • 令牌必须加密后存储:无论用哪种方案,OAuth令牌属于敏感数据,务必加密后再存入,防止泄露
  • 处理令牌过期:在视觉中加入令牌过期校验逻辑,过期自动触发重新认证
  • 沙箱权限:开发调试时,确保pbiviz.json中配置了对应权限(如storage权限)

内容的提问来源于stack exchange,提问作者Pietro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 06:22:40