Node.js获取PowerBI嵌入令牌时遭遇401未授权问题求助
错误信息
2025-03-07T08:31:35.098660921Z Error: Failed to get embed token: 401 Unauthorized - 2025-03-07T08:31:35.098716024Z at /app/src/services/PowerBIService.ts:135:13 2025-03-07T08:31:35.098722924Z at Generator.next (<anonymous>) 2025-03-07T08:31:35.098728225Z at fulfilled (/app/src/services/PowerBIService.ts:5:58) 2025-03-07T08:31:35.098733225Z at processTicksAndRejections (node:internal/process/task_queues:95:5)
已完成的配置
- 在PowerBI中创建了Workspace
- 为Workspace分配了所有必要的API权限
- 在Azure中创建了新应用
- 为Azure应用授予了PowerBI权限
- 创建包含该应用(服务主体)的安全组
- 将该安全组分配为PowerBI Workspace的管理员角色
- 在PowerBI管理员门户的租户设置中启用了所有必要选项
实现代码
使用应用的Tenant ID、Client ID和Client Secret,通过ClientSecretCredentials编写了以下方法:
async function getPowerBIEmbedResponse( reportId: string, datasetId: string, groupId: string ): Promise<any> { Logger.info("Inside getPowerBIEmbedResponse"); try { const credential = new ClientSecretCredential( "bbbb", // Tenant ID "aaaa", // App Registration client ID "abcd" // Client secret ); const tokenResponse = await credential.getToken( "https://analysis.windows.net/powerbi/api/.default" ); // const tokenResponse = await credential.getToken( // "https://graph.microsoft.com/.default" // ); if (!tokenResponse || !tokenResponse.token) { throw new Error("Failed to retrieve Azure access token."); } Logger.info("Token obtained successfully"); const accessToken = tokenResponse.token; const url = `https://api.powerbi.com/v1.0/myorg/groups/${groupId}/reports/${reportId}/GenerateToken`; // https://api.powerbi.com/v1.0/myorg/GenerateToken const response = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${accessToken}`, }, body: JSON.stringify({ accessLevel: "View", datasetId: datasetId, }), }); if (!response.ok) { const errorText = await response.text(); Logger.error(`Error response body: ${errorText}`); throw new Error( `Failed to get embed token: ${response.status} ${response.statusText} - ${errorText}` ); } const data = await response.json(); return data; } catch (error) { Logger.error(`Exception in getPowerBIEmbedResponse: ${error.message}`); throw error; } }
问题详情
已传入目标报表的reportID、datasetID和groupID,但问题仍存在。尝试过代码中两个不同的URL获取Bearer令牌,均无效。怀疑获取用于请求嵌入令牌的Bearer令牌存在其他方式,寻求帮助。
内容的提问来源于stack exchange,提问作者Giacomo Brunetta
相关产品推荐
相关产品推荐

