4

Я пытаюсь получить доступ к новому API REST для создания интерфейса сервер-сервер для интеграции CRM с другими приложениями, такими как веб-магазин и т. Д.Аутентификация с помощью веб-интерфейса REST для MS Dynamics CRM 2016 онлайн

Я попробовал оба способа получать доступ-маркер из Azure AD:

учетных данных клиента

import adal 

token_response = adal.acquire_token_with_client_credentials(
    'https://login.microsoftonline.com/abcdefgh-1234-5678-a1b1-morerandomstuff', 
    client_id, 
    secret 
) 

и пользователя/пароль

import adal 

token_response = adal.acquire_token_with_username_password(
    'https://login.microsoftonline.com/abcdefgh-1234-5678-a1b1-morerandomstuff', 
    '[email protected]_domain.com', 
    'my_password' 
) 

В обоих случаях token_response получает объект token, содержащий accessToken, refreshToken, expiresIn и т. Д. Поэтому я не думаю, что до этого момента есть ошибка.

Тогда я пытаюсь сделать простой запрос к веб-API:

headers = {'Authorization': '%s %s' % (token_response.get('tokenType'), 
             token_response.get('accessToken'))} 

r = requests.get('https://domain.api.crm4.dynamics.com/api/data/v8.0/Product', 
       headers=headers) 

Это всегда возвращает HTTP 401 - Несанкционированное: отказано в доступе.

('WWW-Authenticate', 'Bearer error=invalid_token, 
error_description=Error during token validation!, 
authorization_uri=https://login.windows.net/eabcdefgh-1234-5678-a1b1-morerandomstuff/oauth2/authorize, 
resource_id=https://domain.api.crm4.dynamics.com/') 

Пользователя, который пытается сделать запрос имеет привилегию Office-365-администратор и в CRM имеет все роли менеджера и роли администратора. Что по моему вкусу даже немного, но я где-то читал, что у пользователя должны быть привилегии администратора office-365. В Azure AD настроено приложение, которое имеет «делегированные права» для CRM («Access CRM Online в качестве пользователей организации»).

Что мне здесь не хватает? Или мой REST-get-request ошибочен? Microsoft документация для нового API практически не существует - каждый раз, когда вы нажимаете некоторую ссылку вы получаете документы для старых интерфейсов (API организации и т.д.)

ответ

3

acquire_token_with_username_password имеет optional parameter для определения, какой ресурс вы хотите получить доступ к:

ресурс (str, необязательный): ресурс, к которому вы обращаетесь. По умолчанию 'https://management.core.windows.net/'.

Вы должны, таким образом, быть в состоянии определить, что вы хотите получить доступ к CRM путем добавления ресурса в качестве аргумента acquire_token_with_username_password:

token_response = adal.acquire_token_with_username_password(
    'https://login.microsoftonline.com/abcdefgh-1234-5678-a1b1-morerandomstuff', 
    '[email protected]_domain.com', 
    'my_password', 
    resource='https://domain.crm4.dynamics.com' 
) 

Это должно дать вам соответствующий маркер для доступа к CRM.

После получения правильных маркеров, вы также должны изменить свой API вызова Web немного (от Product до products):

r = requests.get('https://domain.api.crm4.dynamics.com/api/data/v8.0/products', 
       headers=headers) 
+1

Спасибо, я также нашел некоторые примеры код, чтобы заставить человек начали: HTTP: //jlattimer.blogspot.de/2015/11/crm-web-api-using-python.html – Chris

+0

Для Ruby вместо Python ознакомьтесь с этим запросом Pull: https://github.com/visoft/ruby_odata/ pull/59 и, если возможно, использовать библиотеки Microsoft https://github.com/AzureAD/azure-activedirectory-library-for-ruby https://github.com/microsoftgraph/msgraph-sdk-ruby –