在线使用 MS Dynamics CRM 2016 的 REST Web API 进行身份验证
Authenticating with the REST web API of MS Dynamics CRM 2016 online
我正在尝试访问新的 REST API 以构建服务器到服务器的接口以将 CRM 与其他应用程序(例如网上商店等)集成。
我已经尝试了两种从 Azure AD 获取访问令牌的方法:
客户端凭据
import adal
token_response = adal.acquire_token_with_client_credentials(
'https://login.microsoftonline.com/abcdefgh-1234-5678-a1b1-morerandomstuff',
client_id,
secret
)
和user/password
import adal
token_response = adal.acquire_token_with_username_password(
'https://login.microsoftonline.com/abcdefgh-1234-5678-a1b1-morerandomstuff',
'interface@crm.my_domain.com',
'my_password'
)
在这两种情况下,token_response 得到一个令牌对象,包含 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)
这总是 returns 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 中配置了一个应用程序,它具有 "delegated rights" 到 CRM ("Access CRM Online as organization users")。
我在这里错过了什么?还是我的 REST-get-request 错误?
新 API 的 Microsoft 文档几乎不存在 - 每当您单击某些 link 时,您都会获得旧 API 的文档(组织 API 等)
acquire_token_with_username_password
有一个 optional parameter 用于指定您要访问的资源:
resource (str, optional): The resource you are accessing. Defaults to
'https://management.core.windows.net/'.
因此,您应该能够通过将资源作为参数添加到 acquire_token_with_username_password
:
来指定您想要访问 CRM
token_response = adal.acquire_token_with_username_password(
'https://login.microsoftonline.com/abcdefgh-1234-5678-a1b1-morerandomstuff',
'interface@crm.my_domain.com',
'my_password',
resource='https://domain.crm4.dynamics.com'
)
这应该为您提供访问 CRM 的正确令牌。
获得正确的token后,你还需要稍微修改一下你的WebAPI调用(从Product
到products
):
r = requests.get('https://domain.api.crm4.dynamics.com/api/data/v8.0/products',
headers=headers)
我正在尝试访问新的 REST API 以构建服务器到服务器的接口以将 CRM 与其他应用程序(例如网上商店等)集成。
我已经尝试了两种从 Azure AD 获取访问令牌的方法:
客户端凭据
import adal
token_response = adal.acquire_token_with_client_credentials(
'https://login.microsoftonline.com/abcdefgh-1234-5678-a1b1-morerandomstuff',
client_id,
secret
)
和user/password
import adal
token_response = adal.acquire_token_with_username_password(
'https://login.microsoftonline.com/abcdefgh-1234-5678-a1b1-morerandomstuff',
'interface@crm.my_domain.com',
'my_password'
)
在这两种情况下,token_response 得到一个令牌对象,包含 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)
这总是 returns 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 中配置了一个应用程序,它具有 "delegated rights" 到 CRM ("Access CRM Online as organization users")。
我在这里错过了什么?还是我的 REST-get-request 错误? 新 API 的 Microsoft 文档几乎不存在 - 每当您单击某些 link 时,您都会获得旧 API 的文档(组织 API 等)
acquire_token_with_username_password
有一个 optional parameter 用于指定您要访问的资源:
resource (str, optional): The resource you are accessing. Defaults to 'https://management.core.windows.net/'.
因此,您应该能够通过将资源作为参数添加到 acquire_token_with_username_password
:
token_response = adal.acquire_token_with_username_password(
'https://login.microsoftonline.com/abcdefgh-1234-5678-a1b1-morerandomstuff',
'interface@crm.my_domain.com',
'my_password',
resource='https://domain.crm4.dynamics.com'
)
这应该为您提供访问 CRM 的正确令牌。
获得正确的token后,你还需要稍微修改一下你的WebAPI调用(从Product
到products
):
r = requests.get('https://domain.api.crm4.dynamics.com/api/data/v8.0/products',
headers=headers)