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

Я пытаюсь использовать API-интерфейс Power BI REST, используя токен доступа, полученный с помощью метода "учетные данные клиента", но я продолжаю получать 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 был каким-то образом испорчен, я просмотрел токен доступа "неправильным способом" через браузер webtools, и выше это прекрасно работает, возвращаясь a 200 и ответ JSON, в котором перечислены мои наборы данных.

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

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

Ответ 1

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

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

  • аналогичный пример JavaScript username-password-sample.js
  • a resource значение https://analysis.windows.net/powerbi/api (спасибо, slugslog)
  • добавление 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. Но насколько это доказательство концепции для этого случая аутентификации, этот ответ я пришел.

Ответ 2

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

Ответ 3

Это не ответ, а один шаг вперед в процессе отладки. Я думаю, что ресурс, для которого запрашивается токен, должен быть " 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

Ответ 4

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

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

BTW, дополнительный "v" после -v кажется лишним.

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

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