Получите токен доступа Azure AD без секрета клиента, имя пользователя/пароль для Power BI от Angular

#angular #azure-active-directory #powerbi #access-token

Вопрос:

Дорогие, моему приложению Angular необходимо получить ключ доступа, с scope=https://analytics.windows.net/powerbi/api помощью которого мне нужно получить маркер встраивания Power BI. Я не могу использовать имя пользователя/пароль или client_secret. Я могу предоставить client_id/tenant_id, redirect_uri, я просмотрел все сообщения sof и прочитал много документов в сети, но не могу этого понять. В моем приложении есть перенаправленный логин AAD, но у маркера доступа есть scope=api://<some id> profile openid ... Возможность использовать неявное предоставление? Поток кода авторизации требует интерактивного входа в систему, что невозможно. Кто-нибудь может помочь, пожалуйста? Любой пример углового кода/ссылки на код будут великолепны.

…..

Более Подробная Информация:

Мы используем подход «Приложение владеет данными». Вошедшие в систему пользователи не будут иметь доступа для входа в систему Power BI. Мы используем принцип безопасности на стороне Azure и добавили разрешение API службы power-bi с возможностью чтения отчетов/наборов данных/панели мониторинга.все с помощью зарегистрированного приложения пользовательского интерфейса.

Комментарии:

1. Смотрите новый ответ. TLDR вам нужен API (например, функция Azure или приложение службы приложений) для создания маркера встраивания для «Данных, принадлежащих приложению».

2. Я добавил более подробную информацию в этом посте, приношу извинения за то, что не добавил ее раньше, не могли бы вы, пожалуйста, проверить их и предложить решение? Действительно сильно застрял здесь! Спасибо @DavidBrowne-Microsoft

Ответ №1:

Для встраивания из браузерного приложения без поддержки внутреннего API ваши пользователи должны быть пользователями Power BI Pro (или Премиум-класса для каждого пользователя), и вы должны использовать стиль встраивания «Встраивание для вашей организации».

Здесь есть образец в React и машинописный текст: https://docs.microsoft.com/en-us/power-bi/developer/embedded/embed-sample-for-your-organization

А вот код, который получает токен доступа:

  msalInstance.acquireTokenSilent(loginRequest)
        .then((response: AuthResponse) => {

            // get access token from response: response.accessToken
            accessToken = response.accessToken;
            this.setUsername(response.account.name);
            this.getembedUrl();
        })
        .catch((err: AuthError) => {

            // refresh access token silently from cached id-token
            // makes the call to handleredirectcallback
            if (err.name === "InteractionRequiredAuthError") {
                msalInstance.acquireTokenRedirect(loginRequest);
            }
            else {
                thisObj.setState({ error: [err.toString()] })
            }
        });
 

https://github.com/microsoft/PowerBI-Developer-Samples/blob/master/React-TS/Embed for your organization/UserOwnsData/src/App.tsx

Использование этой библиотеки: Приложение UserAgent для взаимодействия с AAD.

Поскольку вы получаете маркер доступа с удостоверением пользователя, вы не можете использовать рабочий процесс «Приложение владеет данными». Для этого рабочего процесса требуется секрет клиента или имя пользователя/пароль. Без безопасного API для связи со службой Power BI и создания маркера встраивания невозможно безопасно использовать «Данные, принадлежащие приложению». Таким образом, вам понадобится какой-то защищенный серверный API, чтобы хранить секрет клиента и генерировать маркер встраивания.

Комментарии:

1. Спасибо @DavidBrowne-Microsoft за ответ. На самом деле мы используем подход «приложение владеет данными» / «встраивание для вашего клиента». Пожалуйста, смотрите раздел «Более подробная информация» в главном вопросе, где я добавил дополнительные сведения о реализации. Извините, что не добавил эти детали раньше.

2. Это не сработает. Вам нужен безопасный внутренний API для создания маркера встраивания. Технически вы могли бы использовать API только для генерации токена доступа, но это было бы почти так же небезопасно, как отправка секрета клиента или имени пользователя/пароля в браузер.

3. К сожалению, создание приложения функций Azure или любого другого внутреннего API сейчас не является вариантом. Есть ли какой-нибудь другой способ сделать это?

4. Не надежно, нет. Невозможно использовать «данные, принадлежащие приложению» / «встраивание для вашего клиента», не используя секрет клиента или пользователя/пароль для создания маркера доступа Power BI, который затем используется для создания маркера встраивания. Невозможно сделать это безопасно , не имея внутреннего API, который вы можете вызвать для создания маркера встраивания.

5. Если вы отправите секрет клиента в браузер, все пользователи будут иметь те же права доступа, что и участник службы встраивания. Вы не сможете надежно ограничить, какие отчеты и наборы данных они могут использовать, или установить идентификатор для безопасности на уровне строк.