Не удается получить токен доступа к учетным данным клиента для авторизации Power BI

Я пытаюсь использовать REST API Power BI, используя токен доступа, полученный с помощью метода «учетные данные клиента», но я продолжаю получать 403 Forbidden по своим запросам.

Мой код следует шаблону, показанному в этот образец AzureAD. На самом деле, чтобы изолировать эту проблему, я запускаю этот пример кода (конечно, с моими собственными значениями в parameters.json):

{ 
  expiresIn: 3599,
  tokenType: 'Bearer',
  expiresOn: Tue Sep 01 2015 16:56:07 GMT-0500 (CDT),
  resource: '00000002-0000-0000-c000-000000000000',
  accessToken: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1uQ19WWmNBVGZNNXBPWWlKSE1iYTlnb0VLWSIsImtpZCI6Ik1uQ19WWmNBVGZNNXBPWWlKSE1iYTlnb0VLWSJ9.eyJhdWQiOiIwMDAwMDAwMi0wMDAwLTAwMDAtYzAwMC0wMDAwMDAwMDAwMDAiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC8xM2QxNzIwNC0wZGU2LTQ1NzQtOTgzYS05NjFhYjk0M2M3Y2UvIiwiaWF0IjoxNDQxMTQwNjcwLCJuYmYiOjE0NDExNDA2NzAsImV4cCI6MTQ0MTE0NDU3MCwidmVyIjoiMS4wIiwidGlkIjoiMTNkMTcyMDQtMGRlNi00NTc0LTk4M2EtOTYxYWI5NDNjN2NlIiwib2lkIjoiYzM1ZWQyYTktYTYzZS00YzAwLThmYmYtY2FlYjlmZjYwMjYwIiwic3ViIjoiYzM1ZWQyYTktYTYzZS00YzAwLThmYmYtY2FlYjlmZjYwMjYwIiwiaWRwIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvMTNkMTcyMDQtMGRlNi00NTc0LTk4M2EtOTYxYWI5NDNjN2NlLyIsImFwcGlkIjoiNDQ2Y2Y5OTItMDQzYS00YjgxLWJhYzQtY2RlZWYyNGFhNzFjIiwiYXBwaWRhY3IiOiIxIn0.YTGJfdW1wP09bDHwwsv3FPAmEpmQdc_kifvgY-1KjhkZWANfYtd050wfeZdNgMUeSPZyFdWnoBjnJ4xrlDtnsADwV1Grr6TXYcymPLofbY-xy0cjyvzxTmM11DJ9XN8A4tkgvK0jtR-YyIjPw5EKJSKyeEbD9U3mWsE_gu7IzKzXl8e-dfVAqRYS6WHZy6_0FaNmppPDls5s_QIPOHofFSiWVISw41Mz0fQnP2QEGyceOCvKYJtrUOCDwfVuwFS-gSLmYvEGOJfmIjftP3srda0JPirVzBeU0IFJJ1KW81kE5cfKw1KkBB04VVetRUs_7HqloYaKKiTybauhXAodRQ',
  isMRRT: true,
  _clientId: '[snip]',
  _authority: 'https://login.windows.net/[snip]' 
}

Когда я использую этот токен доступа в запросе curl следующим образом, я получаю 403:

curl -vv -X GET https://api.powerbi.com/v1.0/myorg/datasets -H"Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1uQ19WWmNBVGZNNXBPWWlKSE1iYTlnb0VLWSIsImtpZCI6Ik1uQ19WWmNBVGZNNXBPWWlKSE1iYTlnb0VLWSJ9.eyJhdWQiOiIwMDAwMDAwMi0wMDAwLTAwMDAtYzAwMC0wMDAwMDAwMDAwMDAiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC8xM2QxNzIwNC0wZGU2LTQ1NzQtOTgzYS05NjFhYjk0M2M3Y2UvIiwiaWF0IjoxNDQxMTQwNjcwLCJuYmYiOjE0NDExNDA2NzAsImV4cCI6MTQ0MTE0NDU3MCwidmVyIjoiMS4wIiwidGlkIjoiMTNkMTcyMDQtMGRlNi00NTc0LTk4M2EtOTYxYWI5NDNjN2NlIiwib2lkIjoiYzM1ZWQyYTktYTYzZS00YzAwLThmYmYtY2FlYjlmZjYwMjYwIiwic3ViIjoiYzM1ZWQyYTktYTYzZS00YzAwLThmYmYtY2FlYjlmZjYwMjYwIiwiaWRwIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvMTNkMTcyMDQtMGRlNi00NTc0LTk4M2EtOTYxYWI5NDNjN2NlLyIsImFwcGlkIjoiNDQ2Y2Y5OTItMDQzYS00YjgxLWJhYzQtY2RlZWYyNGFhNzFjIiwiYXBwaWRhY3IiOiIxIn0.YTGJfdW1wP09bDHwwsv3FPAmEpmQdc_kifvgY-1KjhkZWANfYtd050wfeZdNgMUeSPZyFdWnoBjnJ4xrlDtnsADwV1Grr6TXYcymPLofbY-xy0cjyvzxTmM11DJ9XN8A4tkgvK0jtR-YyIjPw5EKJSKyeEbD9U3mWsE_gu7IzKzXl8e-dfVAqRYS6WHZy6_0FaNmppPDls5s_QIPOHofFSiWVISw41Mz0fQnP2QEGyceOCvKYJtrUOCDwfVuwFS-gSLmYvEGOJfmIjftP3srda0JPirVzBeU0IFJJ1KW81kE5cfKw1KkBB04VVetRUs_7HqloYaKKiTybauhXAodRQ"

Задаваясь вопросом, был ли этот запрос curl каким-то образом ошибочным, я отследил токен доступа "неправильным образом" с помощью веб-инструментов браузера, и выше работает нормально, возвращая 200 и ответ JSON со списком моих наборов данных.

Я также заметил, что код возврата — 403 (запрещено), а не 401 (неавторизовано), поэтому я задался вопросом, была ли авторизация в порядке, но разрешения на стороне Power BI были неправильными. Но я также получаю 403, когда использую любой мусорный текст для токена доступа (например, Authorization: Bearer foo), поэтому я отбросил эту теорию.

Так. Я думаю, что у меня есть действительный тест, и я получаю то, что я считаю действительным токеном доступа (из этого кода client-credentials-sample.js), но это все еще не работает. Что мне не хватает?


person cgrayson    schedule 01.09.2015    source источник
comment
Пришлите мне свой код, и я отлажу его для вас bit.ly/emailjon. Я в команде Power Bi.   -  person Jon Gallant    schedule 05.10.2015
comment
Это нелепо. Это самая хлопотная работа с REST Api, которую я когда-либо видел. Обычно это пара кликов, чтобы получить ключ или токен, и в течение нескольких минут вы можете получить результаты через почтальона. Почему команда PBI не может создать простую веб-страницу для автоматизации включения API и создания пробных вызовов на основе учетных данных реальной учетной записи, как это делают многие другие?   -  person whitneyland    schedule 26.03.2017


Ответы (4)


С помощью некоторых сотрудников Microsoft (спасибо, Джон Галлант и Джош Каплан) я узнал, что аутентификация с помощью потока клиентских учетных данных OAuth, как я делал с этим примером JavaScript, обеспечивает недостаточный доступ . Чтобы использовать Power BI, аутентификация должна основываться на конкретном пользователе.

Я пытался использовать:

  1. аналогичный пример JavaScript имя пользователя -пароль-sample.js
  2. resource значение https://analysis.windows.net/powerbi/api (спасибо, slugslog)
  3. добавление username и password к parameters.json

Это сблизило меня, но я все еще получал ответ 400: "error_description":"AADSTS90014: The request body must contain the following parameter: 'client_secret or client_assertion'. …".

Взлом библиотеки adal-node (жесткое кодирование секрета клиента, т. е. oauthParameters[OAuth2Parameters.CLIENT_SECRET] = "my-client-secret"; после строка 217 из token-request.js) было достаточно, чтобы вернуть токен доступа, который работает в заголовке Authorization для моего исходного вызова curl.

Конечно, жесткое кодирование этого значения не является моим окончательным решением. В любом случае, я не планирую использовать библиотеку adal-node. Но что касается этого доказательства концепции для этого случая аутентификации, это ответ, к которому я пришел.

person cgrayson    schedule 06.10.2015
comment
@cgrayson Вы когда-нибудь получали другое решение для этого? Я имею в виду, есть ли другая библиотека, которая выдает правильный токен доступа? - person Vishwas Shashidhar; 18.01.2017
comment
@VishwasShashidhar Нет, никогда не делал. Мы закончили кодирование собственных методов для получения и использования токенов доступа. - person cgrayson; 20.01.2017
comment
@cgrayson Ну, это позор! Но все равно спасибо! Похоже, мне придется клонировать репо и изменить код. - person Vishwas Shashidhar; 20.01.2017

Убедитесь, что ваше приложение, зарегистрированное в AAD, имеет разрешение на чтение и запись всех наборов данных. Это должно решить проблему.

person Josh Caplan - MSFT    schedule 02.09.2015
comment
В Azure Active Directory на вкладке «Настроить» для этого приложения в разделе «Разрешения для других приложений» есть служба Power BI. Он показывает Разрешения приложения: 0 (эта стрелка ничего не всплывает для изменения) и Делегированные разрешения: 7 (в этом раскрывающемся списке показаны все отмеченные флажки, включая Чтение и запись всех наборов данных (предварительная версия)). Это то, что уже было установлено перед вышеуказанными тестами; Я еще ничего не менял. Я смотрю в правильном месте? - person cgrayson; 02.09.2015
comment
Я взломал токен, который был у вас в приведенном выше примере. Я не вижу этих разрешений в нем. Первое, что нужно проверить, это то, что вы используете тот же идентификатор приложения, что и тот, который вы проверяли в AAD. Если да, то это веб-приложение или собственное приложение? - person Josh Caplan - MSFT; 03.09.2015
comment
Хм, я не уверен, что такое идентификатор приложения? Где я могу найти это в Azure и/или установить на стороне клиента? Я сопоставил свой поиск по clientId, это то же самое. И это веб-приложение. По крайней мере, пытается быть. :-) - person cgrayson; 03.09.2015
comment
Ага. Идентификатор клиента тот же. Попробуйте следующее: перейдите на страницу portal.office.com/myapps. Найдите свое приложение и удалите его. Затем попробуйте снова запустить приложение. Он должен запросить ваше согласие еще раз. - person Josh Caplan - MSFT; 03.09.2015

Это не ответ, а один шаг вперед в процессе отладки. Я думаю, что ресурс, для которого запрашивается токен, должен быть "https://analysis.windows.net/powerbi/api". Я видел их во многих ссылках; один из них связан ниже. Даже после изменения этого я все еще получаю 403. Как упомянул OP, если мы используем accessToken с портала powerBI, все работает.

http://blogs.msdn.com/b/richard_dizeregas_blog/archive/2015/02/24/building-apps-with-the-new-power-bi-apis.aspx&ei=HzQDaQP3&lc=en-IN&geid=7&s=  1&m=620&ts=1443608339&sig=APONPFlUC04ktQuEYWqI_VKfMqvxascf0A

person slugslog    schedule 30.09.2015
comment
Когда я пытаюсь каким-либо образом получить доступ к analysis.windows.net, я получаю сообщение "Сервер не найден". Также неясно, где вы предлагаете использовать этот URL. В качестве URL-адреса авторитетного узла (как здесь? Или как цель для фактического запроса BI (как в моем исходном curl примере)? - person cgrayson; 01.10.2015
comment
это должно быть значение свойства ресурса, для которого вы запрашиваете токен. Вот пример nodejs, с которым я работаю. Это вместо значения «00000009-0000-0000-c000-000000000000», которое вы используете в настоящее время. - person slugslog; 02.10.2015

Итак, я попробовал это со своим собственным приложением, работает следующая команда (для меня):

curl -vv -X GET https://api.powerbi.com/v1.0/myorg/datasets -H"Authorization: Bearer ey....qqqq"

Кстати, лишний "v" после -v кажется излишним.

Итак, я могу сделать вывод, что в вашем приложении отсутствуют необходимые разрешения для вызова API-интерфейсов Power BI.

Вы можете попробовать взять один из наших примеров, создать для него новое приложение в AAD, а затем посмотреть, работает ли для него токен авторизации. Вот хороший пример: https://github.com/PowerBI/Integrate-a-tile-into-an-app

person Lukasz P.    schedule 02.10.2015
comment
Да, ты прав насчет моего -vv. Где-то вдоль линии я думал, что curl была одной из тех команд, которые увеличивают многословие с большим количеством vs, но нет. - person cgrayson; 07.10.2015