Не удается получить токен доступа к учетным записям для авторизации 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