Power BI JS API

Power BI JS API

Konstantin Rudenok

Материал поможет раз и навсегда разобраться с процессом авторизации собственных приложений в API Power BI без необходимости использования AAD

Зачем?

Power BI стремительно набирает популярность как средство построения интерактивной отчетности, что и неудивительно — продукт постоянно развивается, стоит недорого, выглядит нескучно. Конечно, как и любой другой продукт, он обладает целым рядом недостатков, однако наиболее критичные при желании всегда можно преодолеть, если проявить упорство и нежелание мириться с текущей ситуацией.

Так, в данном материале речь пойдет о внедрении отчетов в собственные приложения (в контексте данного приложения подразумеваются WEB-приложения).

Зачем это нужно?

Дело в том, что система разграничения доступов в сервисе Power BI далеко не идеальна и не может предусмотреть даже такие простые модели распространения, как распространение нескольких отчетов в одной и той же рабочей области на несколько разных лиц.

Да, вы можете создать несколько различных областей, и каждую из областей назначить нужному лицу, однако рассмотрим ситуацию: вы представляете агентство и должны поделиться отчетом со своими специалистами, менеджером клиента и руководителем со стороны клиента. Данные в отчете будут одни и те же, изменения касаются лишь визуальной составляющей и агрегаций. Можно сделать 3 разных отчета на одной и той же модели данных, распределить отчеты по различным рабочим областям и настроить доступы разных клиентов для этих областей, не забыв при этом оплатить каждому из них лицензию Power BI Pro.

Не очень удобно, верно?

Давайте попробуем придумать кое-что получше.

Авторизация

Нельзя упрекнуть Microsoft в полном отсутствии информации по теме — все, что нужно знать, можно посмотреть здесь, и даже на русском языке.

Однако что делать, если у вас нет Premium-версии или вы не хотите использовать AAD? Ответ ниже.

Создание приложения Power BI

Для начала нам потребуется зарегистрировать новое приложение в портале разработчика Power BI:

  1. Переходим по ссылке, указанной выше.
  2. Авторизуемся под существующим аккаунтом Power BI.
  3. Вводим имя, тип приложения (Server-side Web app) и указываем домашний адрес и адрес для редиректа (вовсе не обязательно указывать существующие адреса, если вы не планируете настраивать там обработчики кодов ответа), затем выбираем нужные уровни доступа.
  4. Регистрируем приложение и сохраняем Client ID и Client Secret, они нам понадобятся в дальнейшем.

Приложений может быть несколько, поэтому рекомендую сохранять информацию в структурированном виде, например, в виде JSON:

[
 {
  "client_id": "Client ID Приложения",
  "client_secret": "Client Secret Приложения",
  "redirect_url": "http://mydomain.ru/auth",
  "home_page": "http://mydomain.ru/",
  "app_name": "Мое приложение"
 }
]

Подтверждение приложения

Мы не хотим связываться с Azure Active Directory и будем получать токены по авторизационным данным пользователя Power BI.

В общем случае такой запрос выглядит так:

POST https://login.windows.net/common/oauth2/token
{
 "grant_type": "password",
 "scope": "openid",
 "resource": "https://analysis.windows.net/powerbi/api",
 "client_id": "Сохранённый ID",
 "client_secret": "Сохраненный ключ",
 "username": "Почтовый адрес пользователя, из-под которого создавалось приложение",
 "password": "Пароль пользователя"
}

Однако, если сейчас мы выполним этот запрос, то в ответ получим лишь такую информацию:

{
 "error": "invalid_grant",
 "error_description": "AADSTS65001: The user or administrator has not consented to use the application with ID 'ИНФОРМАЦИЯ'. Send an interactive authorization request for this user and resource.\r\nTrace ID: ИНФОРМАЦИЯ\r\nCorrelation ID: ИНФОРМАЦИЯ\r\nTimestamp: Дата",
 "error_codes": [65001],
 "timestamp": "ДАТА",
 "trace_id": "ИНФОРМАЦИЯ",
 "correlation_id": "ИНФОРМАЦИЯ"
}

Чтобы избавиться от ошибки, нужно выполнить интерактивный запрос авторизации.

Для этого достаточно перейти по такой ссылке, заменив нужные значения:

https://login.microsoftonline.com/common/oauth2/authorize?client_id=СОХРАНЕННЫЙID&redirect_uri=АДРЕСПРИЛОЖЕНИЯ&response_type=code&prompt=admin_consent

На открывшейся странице нужно всего лишь разрешить доступ своего приложения, и на этом подтверждение статуса приложения можно считать оконченным.

Работа с токенами доступа

Получение нового токена доступа производится с помощью запроса:

POST https://login.windows.net/common/oauth2/token
{
 "grant_type": "password",
 "scope": "openid",
 "resource": "https://analysis.windows.net/powerbi/api",
 "client_id": "Сохранённый ID",
 "client_secret": "Сохраненный ключ",
 "username": "Почтовый адрес пользователя, из-под которого создавалось приложение",
 "password": "Пароль пользователя"
}

В теле ответа мы можем найти всю информацию по токену.

По умолчанию срок жизни токена составляет 1 час.

Обновлять токен можно следующим запросом:

POST https://login.windows.net/common/oauth2/token
{
 "grant_type": "refresh_token",
 "refresh_token": "Токен",
 "resource": "https://analysis.windows.net/powerbi/api",
 "client_id": "Сохранённый ID",
 "client_secret": "Сохраненный ключ"
}

Подготовка элемента внедрения

С помощью JS API PowerBI можно внедрять в приложение собственные плитки и отчёты.

Для этого нужно знать идентификатор внедряемого объекта и идентификатор рабочей области (в случае, если объект вынесен в отдельную рабочую область).

Самый простой способ узнать идентификатор рабочей области - перейти в нее через веб-интерфейс и посмотреть идентификатор в адресной строке:


Аналогичным образом можно узнать и идентификатор отчёта:


Ситуация с плиткой несколько более сложная - явным образом идентификатор плитки не указан в интерфейсе, и получить его можно только при помощи операции Get Tiles, то есть:

В случае, если панель мониторинга находится в отдельной рабочей области, нужно выполнить GET-запрос на адрес:

https://api.powerbi.com/v1.0/myorg/groups/ИДЕНТИФИКАТОРОБЛАСТИ/dashboards/ИДЕНТИФИКАТОРПАНЕЛИ/tiles

В случае, если панель мониторинга находится в рабочей области по умолчанию (Моя рабочая область), нужно выполнить GET-запрос на адрес:

https://api.powerbi.com/v1.0/myorg/dashboards/ИДЕНТИФИКАТОРПАНЕЛИ/tiles

При выполнении запроса обязательно нужно добавить авторизационный заголовок с токеном доступа.

Например, CURL-запрос будет иметь вид:

curl -i https://api.powerbi.com/v1.0/myorg/dashboards/dashboardID/tiles -H "Authorization: Bearer MYTOKEN"

Внедрение элементов

Ранее описанная логика авторизации может быть реализована в виде серверного приложения, выдающего токены доступы по запросу WEB-клиента. Удобно объединить авторизационную часть самого приложения с получением токена доступа.

После получения токена со стороны клиента можно реализовать как загрузку отчета (или плиток), так и манипуляцию ими при помощи Power BI JS API. Подробное описание API можно найти в соответствующем репозитории.

Для внедрения отчета или плитки необходимо задать конфигурацию.

Пример конфигурации для отчета:

{
 type: "report",
 id: "SOMEID",
 embedUrl: "https://app.powerbi.com/reportEmbed?reportId=" + "SOMEID",
 settings: {
  navContentPaneEnabled: false,
  filterPaneEnabled: false
}

Отличие для конфигурации плитки заключается в том, что она не имеет параметра настроек (settings). Помимо этого, необходимо указать идентификатор панели мониторинга (dashboardId).

Пример конфигурации для плитки:

{
 type: "tile",
 id: "SOMEID",
 embedUrl: "https://app.powerbi.com/embed",
 dashboardId: 'SOMEDASHBOARDID'
}

После определения конфигурации внедрение отчета в нужный элемент производится так:

let reportContainer = $('#embedContainer');
window.report = powerbi.embed(reportContainer.get(0), embedConfiguration);

Переменная report объявлена глобальной для всего окна приложения, что позволит отслеживать события отчета и применять функции путем прямого обращения к ней, однако подобный вариант объявления вовсе не является обязательным - при необходимости вы всегда можете получить доступ к объекту внедрения через функцию get:

let element = document.getElementById('#myReport');
let report = powerbi.get(element);

Полный пример

Страница с простой реализацией описанного материала: https://o.const.space/pbi-js/

Логин: testme

Пароль: testme


Как-то так...

Report Page