Я пытаюсь получить данные конкретной страницы с помощью API графика.
Если я попытаюсь запустить https://developer.microsoft.com/en-us/graph/graph-explorer я смогу заставить его работать, а если я использую сгенерированный там токен, он также отлично работает в скрипте.
Но когда я пытаюсь сгенерировать код в скрипте и запустить сам, получаю ошибку 404.
Вот сценарий:
from msal import ConfidentialClientApplication
authority = "https://login.microsoftonline.com/common"
#get connection to the API working
app = ConfidentialClientApplication(client_id, authority = "https://login.microsoftonline.com/my-tenant-id", client_credential=client_secret)
result = app.acquire_token_for_client(['https://graph.microsoft.com/.default'])
if "access_token" in result:
print('Access Token: ', result["access_token"])
import requests
#response = requests.get("https://graph.microsoft.com/v1.0/users", headers = {'Authorization': 'Bearer {}'.format(result["access_token"])})
response = requests.get("https://graph.microsoft.com/v1.0/users/myuser/onenote/pages/page-id/content", headers = {'Authorization': 'Bearer '+result["access_token"]})
Разрешения Azure:
Скриншот ошибки:
Обозреватель графов
Собственно выхожу из мыслей о том, чего мне может не хватать.
Уже проверил все разрешения снова и снова.
Любое предложение будет очень оценено.
Обратите внимание, что Graph Explorer использует разрешения типа Delegated
, которые работают на основе доступа вошедшего пользователя.
Но ваш код Python использует поток учетных данных клиента для получения токена, который работает только с разрешениями типа Application
. В моей записной книжке OneNote есть образец страницы с содержимым ниже:
Когда я запустил вызов API через Graph Explorer, он сработал и получил контент, как показано ниже:
GET https://graph.microsoft.com/v1.0/users/myuser/onenote/pages/page-id/content
Ответ:
Но когда я делаю то же самое, запуская ваш код Python, предоставляющий разрешения типа Delegated
, я получаю следующую ошибку 40004:
Чтобы устранить эту ошибку, обязательно предоставьте Notes.Read.All разрешение Microsoft Graph типа Application
с согласием, как показано ниже:
Когда я снова запустил код после предоставления вышеуказанного разрешения, я успешно получил ответ с содержимым страницы OneNote:
from msal import ConfidentialClientApplication
client_id = "appID"
client_secret = "secret"
app = ConfidentialClientApplication(client_id, authority = "https://login.microsoftonline.com/tenantId", client_credential=client_secret)
result = app.acquire_token_for_client(['https://graph.microsoft.com/.default'])
if "access_token" in result:
print('Access Token: ', result["access_token"])
print()
import requests
#response = requests.get("https://graph.microsoft.com/v1.0/users", headers = {'Authorization': 'Bearer {}'.format(result["access_token"])})
response = requests.get("https://graph.microsoft.com/v1.0/users/[email protected]/onenote/pages/pageId/content", headers = {'Authorization': 'Bearer '+result["access_token"]})
print(response.text)
Ответ:
Не могли бы вы включить полное сообщение об ошибке и изображение разрешений API с портала, отредактировав свой вопрос?
Да, конечно, только что добавил скриншот обоих!
Дали ли вы согласие администратора на добавленные разрешения? Пожалуйста, добавьте также изображение обозревателя графиков, где вы получаете результаты для того же пользователя.
Да, я предоставил права администратора для разрешений приложения. Изображение добавлено.
Хорошо. после того, как я изменил ответ на json, я вижу это сообщение об ошибке: код: 30121, сообщение: у арендатора нет действующей лицензии Sharepoint. У меня есть личная учетная запись Microsoft с лицензией, нужно ли мне тоже платить за Sharepoint? Для чего я его не использую, смысла нет.
Если вы пытаетесь получить доступ к личной учетной записи Microsoft, вам необходимо переключиться на делегированные потоки, такие как интерактивный поток или поток кода авторизации, для создания токена, создав регистрацию приложения с типом учетной записи как «Учетные записи в любом каталоге организации (любой каталог Azure AD — мультитенантный) и личные учетные записи Microsoft (например, Skype, Xbox)»
Поэтому нет никаких изменений в том, чтобы личная учетная запись имела интерактивность, потому что было бы сложно делать это каждый раз при запуске сценария.
Давайте продолжим обсуждение в чате.
Привет, Шридеви, у меня уже есть все разрешения в приложении, но проблема не устранена. Но спасибо за ваш вклад!!