我正在尝试将 D365FO 与第三方应用程序集成,我能够进行正确的设置并注册我的应用程序,获取令牌,如下所示:
我在开发机上使用
resource
作为D365FO的链接,即https://usnconeboxax1aos.cloud.onebox.dynamics.com/
,读取D365FO数据如下图:
我想更改登录方式,所以我代表用户登录,使用密码,所以我禁用了Azure的安全细节(基于this),如下:
并成功获得登录用户的令牌,如下所示:
但是一旦我尝试获取我之前能够获取的相同数据,我得到了 401 unauthorized,尽管我正在使用
Admin
帐户登录:
错误
401 Unauthorized
通常会在您调用具有 invalid 受众的资源时发生。
当您使用
scope
作为 user.read openid profile offline_access 生成访问令牌时,受众将是 Microsoft Graph,它不适用于 D365FO。
我试图通过邮递员在我的环境中重现相同的内容并得到以下结果:
我注册了一个 Azure AD 应用程序并添加了相同的 API 权限,如下所示:
现在,我通过包含如下所示的
same参数生成了授权类型为
password
的代币:
POST https://login.microsoftonline.com/organizations/oauth2/v2.0/token
client_id: <appID>
client_secret: <secret>
scope: user.read openid profile offline_access
grant_type: password
username: [email protected]
password: xxxxxxxxxxx
回复:
您可以通过将上面的访问令牌粘贴到jwt.ms中来解码它以检查观众。
当我解码访问令牌时,我得到 aud 声明为
00000003-0000-0000-c000-000000000000
(即 Microsoft Graph),如下所示:
如果您使用此令牌读取 D365FO 数据,您将收到 401 Unauthorized 错误,因为受众无效。
要 resolve 错误,您需要通过进行以下更改来生成具有
resource
值作为 D365FO 实例的 base URL 的访问令牌:
POST https://login.microsoftonline.com/organizations/oauth2/token
client_id: <appID>
client_secret: <secret>
resource: <base URL of your D365FO instance without the trailing '/'>
grant_type: password
username: [email protected]
password: xxxxxxxxxxx
在你的情况下,resource参数的值应该是
https://usnconeboxax1aos.cloud.onebox.dynamics.com
此令牌将具有 audience 与您的 D365FO 根 URL 相同。要确认这一点,您可以在 jwt.ms 中对其进行解码。如果您使用此令牌读取 D365FO 数据,它将起作用!
参考: