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:
- Переходим по ссылке, указанной выше.
- Авторизуемся под существующим аккаунтом Power BI.
- Вводим имя, тип приложения (Server-side Web app) и указываем домашний адрес и адрес для редиректа (вовсе не обязательно указывать существующие адреса, если вы не планируете настраивать там обработчики кодов ответа), затем выбираем нужные уровни доступа.
- Регистрируем приложение и сохраняем 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
Как-то так...