Я пишу скрипт Python для редактирования электронной таблицы Excel, которая живет в SharePoint. У нас есть офис 365 для бизнеса. Я использую Microsoft Graph API. Я зарегистрировал приложение Python с помощью Microsoft Azure Active Directory (AD) и добавил следующие разрешения (для приложения) для Graph API: (1) Чтение и запись файлов во всех семействах сайтов (предварительный просмотр) и (2) Чтение данных каталога , (У меня был наш администратор компании зарегистрировать приложение для меня.)Azure AD: свойство «scope», отсутствующее из тела ответа Token Response
Моего Python скрипт использует библиотеку запросов для отправки запросов REST:
import json
import requests
MSGRAPH_URI = 'https://graph.microsoft.com'
VERSION = 'v1.0'
def requestAccessToken(tenant_id, app_id, app_key):
MSLOGIN_URI = 'https://login.microsoftonline.com'
ACCESS_TOKEN_PATH = 'oauth2/token'
GRANT_TYPE = 'client_credentials'
endpoint = '{0}/{1}/{2}'.format(MSLOGIN_URI, tenant_id, ACCESS_TOKEN_PATH)
headers = {'Content-Type': 'Application/Json'}
data = {
'grant_type': GRANT_TYPE,
'client_id': app_id,
'client_secret': app_key,
'resource': MSGRAPH_URI
}
access_token = response.json()['access_token']
return access_token
def getWorkbookID(access_token, fileName):
endpoint = '{0}/{1}/me/drive/root/children'.format(MSGRAPH_URI, VERSION)
headers = {
'Content-Type': 'Application/Json',
'Authorization': 'Bearer {}'.format(access_token)
}
response = requests.get(endpoint, headers=headers)
print response.text
assert response.status_code == 200
items = response.json()['value']
workbook_id = None
for item in items:
if item['name'] == fileName:
workbook_id = item['id']
return workbook_id
access_token = requestAccessToken(TENANT_ID, APP_ID, APP_KEY)
workbook_id = getWorkbookID(access_token, WORKBOOK_FILENAME)
Питон приложения успешно запрашивает и получает access_token
с сервера Microsoft. Маркер доступа начинается как этот
eyJ0eXAiOiJKV1QiLCJub25jZSI6...
Затем он запрашивает список моих файлов в getWorkbookID():
GET https://graph.microsoft.com/v1.0/me/drive/root/children
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJub25jZSI6...
Это ответ на этот запрос REST:
{
"error": {
"code": "InternalServerError",
"message": "Object reference not set to an instance of an object.",
"innerError": {
"request-id": "aa97a822-7ac5-4986-8ac0-9852146e149a",
"date": "2016-12-26T22:13:54"
}
}
}
Примечание что я успешно получаю список своих файлов, когда я запрашиваю его через Graph Explorer (https://graph.microsoft.io/en-us/graph-explorer).
EDIT:
- Изменено название от "Microsoft Graph API Возвращает Object ссылка не указывает на экземпляр объекта" в "Azure AD "Сфера" Missing из маркера доступа Response".
- Изменено «меня» в Ури запроса GET к «myOrganization», после прочтения этого: graph.microsft.io/en-us/docs/overview/call_api
То есть,
GET https://graph.microsoft.com/v1.0/myOrganization/drive/root/children
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJub25jZSI6...
Теперь получите следующий ответ.
{
"error": {
"code": "AccessDenied",
"message": "Either scp or roles claim need to be present in the token.",
"innerError": {
"request-id": "bddb8c51-535f-456b-b43e-5cfdf32bd8a5",
"date": "2016-12-28T22:39:25"
}
}
}
Глядя на пример в graph.microsoft.io/en-us/docs/authorization/app_authorization, я вижу, что тело маркеров доступа ответ содержит свойство «Scope», в котором перечислены разрешения, предоставленные для приложения во время регистрации приложения. Тем не менее, ответ маркера доступа, который я получаю с сервера, не имеет свойства «scope». Вот как выглядит мой токен доступа.
{
"token_type":"Bearer",
"expires_in":"3599",
"ext_expires_in":"0",
"expires_on":"1482968367",
"not_before":"1482964467",
"resource":"https://graph.microsoft.com",
"access_token":"eyJ0eXAiOiJKV..."
}
Вопросы:
- У меня был администратор зарегистрировать приложение в Azure AD и установите флажки для разрешений приложений API Microsoft Graph необходимо. По-видимому, этого недостаточно. Что еще нужно? Почему разрешения отсутствуют в теге ответа на токен?
- Каков правильный URI для запроса GET? Является ли «MyOrganization» правильное значение в URI?
Ошибка в классическом исключении NullReferenceException в .NET. Может быть ошибкой в API, или чего-то не хватает, чего он ожидал. Не похоже на проблему с разрешением. – juunas