在Azure Data Factory中获取Power BI有效访问令牌失败,需导出可视化表格为Excel
解决Power BI报表导出Excel及ADF中获取有效作用域令牌的问题
一、完善Azure Entra ID应用注册配置
1. 设置应用ID URI
- 登录Azure门户,进入Azure Entra ID → 应用注册,找到你的目标应用
- 在“概述”页面点击添加应用ID URI,选择“添加”选项
- 可使用默认生成的
api://{你的客户端ID}格式,也可自定义URI,完成后保存配置
2. 配置重定向URI(授权码流场景需要)
- 在应用注册的身份验证页面,点击添加平台,选择“Web”类型
- 输入重定向URI(示例:
http://localhost:8080/redirect),勾选“授权代码流”选项,保存配置
二、配置正确的Power BI权限
- 进入应用注册的API权限页面,点击添加权限 → 选择Power BI Service
- 根据使用场景选择对应权限:
- 若采用客户端凭证流(自动化无交互):选择“应用权限”,添加
Report.Read.All权限,点击授予管理员同意(需租户管理员权限) - 若采用授权码流(需用户交互):选择“委托权限”,添加
Report.Read.All权限,同样需完成管理员同意(或按租户配置由用户自行同意)
- 若采用客户端凭证流(自动化无交互):选择“应用权限”,添加
三、获取带有效作用域的Power BI访问令牌
方案1:客户端凭证流(推荐ADF自动化场景)
在ADF中创建REST活动,配置如下:
- URL:
https://login.microsoftonline.com/{你的租户ID}/oauth2/v2.0/token - 请求方法:POST
- 请求头:
Content-Type: application/x-www-form-urlencoded - 表单格式请求体:
grant_type:client_credentialsclient_id:你的应用客户端IDclient_secret:你的应用客户端密钥scope:https://analysis.windows.net/powerbi/api/.default
- 执行活动后,返回结果中的
access_token即为带有效作用域的令牌,可用于后续Power BI API调用
方案2:授权码流(需用户交互)
获取授权码
构造以下URL,替换占位符后在浏览器打开,使用拥有Power BI报表访问权限的用户登录:https://login.microsoftonline.com/{租户ID}/oauth2/v2.0/authorize?client_id={客户端ID}&response_type=code&redirect_uri={你的重定向URI}&response_mode=query&scope=https://analysis.windows.net/powerbi/api/Report.Read.All offline_access&state=12345登录成功后,跳转页面的地址栏中
code参数即为授权码换取访问令牌
在ADF中创建REST活动,配置:- URL:
https://login.microsoftonline.com/{租户ID}/oauth2/v2.0/token - 请求方法:POST
- 请求头:
Content-Type: application/x-www-form-urlencoded - 表单格式请求体:
grant_type:authorization_codeclient_id:你的应用客户端IDclient_secret:你的应用客户端密钥code:刚获取的授权码redirect_uri:你的重定向URIscope:https://analysis.windows.net/powerbi/api/Report.Read.All
- URL:
四、调用Power BI导出API生成Excel文件
触发导出请求
创建新的REST活动,配置:- URL:
https://api.powerbi.com/v1.0/myorg/reports/{报表ID}/ExportTo - 请求方法:POST
- 请求头:
Authorization:Bearer @{activity('获取令牌活动名').output.access_token}Content-Type:application/json
- JSON格式请求体:
{ "format": "Excel" }
执行后,返回结果中的
id字段为导出操作ID- URL:
轮询获取下载链接
创建另一个REST活动,配置:- URL:
https://api.powerbi.com/v1.0/myorg/operations/{操作ID} - 请求方法:GET
- 请求头:
Authorization: Bearer @{activity('获取令牌活动名').output.access_token} - 轮询此接口,直到返回结果的
status字段变为Succeeded,此时resourceLocation字段即为Excel文件的下载链接
- URL:
下载文件到存储
使用ADF的复制活动,源选择REST源并输入上述下载链接,目标选择你的存储账户(如Blob存储),完成Excel文件的保存
内容的提问来源于stack exchange,提问作者Walbersy Navarro Valladares
相关产品推荐
相关产品推荐

