【问题标题】:How to connect a Delphi desktop app to a third-party Dynamics 365 app using OAuth 2.0?如何使用 OAuth 2.0 将 Delphi 桌面应用程序连接到第三方 Dynamics 365 应用程序?
【发布时间】:2018-08-24 21:59:33
【问题描述】:

到目前为止,我发现的所有信息是桌面应用程序需要在 Microsoft Azure Active Directory 中注册,并且有一个名为 ADAL 的库可以满足所有需要。

https://msdn.microsoft.com/en-nz/library/gg327838.aspx

https://docs.microsoft.com/en-nz/azure/active-directory/develop/active-directory-authentication-libraries

但我想做的只是登录到已经在 Dynamics 之上运行的第三方应用程序,然后使用 REST 方法读取该第三方应用程序提供的自定义数据。

这可能吗?

如果迫在眉睫,我可以编写一个 C#.NET DCOM 包装类,然后将其导入 Delphi 以访问 ADAL 功能,但第三方 Dynamics 365 应用程序的开发人员希望自己控制访问。

我查看了 Delphi Studio 10.2 Tokyo 提供的 RESTDemos 项目示例,虽然它有许多 OAuth 2.0 示例(这是 Dynamics 365 所需要的),但它们不包括 Dynamics 365 本身。

但是为了查看可能需要什么,我创建了一个测试 Google 应用,完成了 Google Tasks 的登录过程,能够获取 auth-code 和 access-token,然后获取任务列表,所以至少我知道我应该使用的 OAuth 2.0 机制正在工作。

我已获得 CRM 根服务地址,我可以使用他们提供的凭据登录,但这仅适用于 Dynamics 365 Web 应用程序。我希望能够使用相同的凭据来访问他们应用的 API。

编辑:

如果我将 api/data/v8.0/ 附加到他们给我的根 URL,我可以看到所有受支持的 REST 方法的列表。尝试使用诸如 api/data/v8.0/accounts/ 之类的工具会给我一个“拒绝访问”消息,除非我已经通过 Microsoft 登录页面实际登录到 CRM 系统,此时REST 方法返回系统中的每个帐户。

编辑2:

通过进一步调查,我发现我正在寻找的方法是建议用于守护程序/服务器应用程序的方法。

https://docs.microsoft.com/en-nz/azure/active-directory/develop/active-directory-authentication-scenarios#daemon-or-server-application-to-web-api

为此,我必须将应用程序注册到第三方 Dynamics 365 应用程序的 AD 域中。完成此操作后,我可以创建一个公钥,让我无需以特定 Dynamics 365 用户身份登录即可获取 Azure 令牌。

使用的代码类似如下:

  RESTClient.BaseURL := 'https://login.microsoftonline.com/';

  RESTRequest.Method := TRESTRequestMethod.rmPOST;
  RESTRequest.Resource := '/' + ATenantID + '/oauth2/token';

  RESTRequest.Params.AddItem('grant_type', 'client_credentials', TRESTRequestParameterKind.pkGETorPOST);
  RESTRequest.Params.AddItem('client_id', AClientID, TRESTRequestParameterKind.pkGETorPOST);
  RESTRequest.Params.AddItem('client_secret', AClientSecret, TRESTRequestParameterKind.pkGETorPOST);
  RESTRequest.Params.AddItem('resource', AResourceURI, TRESTRequestParameterKind.pkGETorPOST);

  RESTRequest.Execute;

ATentantIDAClientIDAClientSecretAResourceURI值都可以从Azure Active Directory中获取;来自其属性或已注册应用的属性。

然后您从 RESTRequest.Response 对象中提取 Token。

【问题讨论】:

    标签: oauth-2.0 dynamics-crm delphi-10.2-tokyo


    【解决方案1】:

    当您的应用程序已正确注册和配置后,使用 Delphi REST 客户端库 的以下代码将向 Dynamics 365 进行身份验证:

      RESTClient.BaseURL := 'https://login.microsoftonline.com/';
      RESTClient.Authenticator := OAuth2_Dynamics365;
    
      RESTRequest.Method := TRESTRequestMethod.rmPOST;
      RESTRequest.Resource := '/' + ATenantID + '/oauth2/token';
    
      RESTRequest.Params.AddItem('grant_type', 'client_credentials', TRESTRequestParameterKind.pkGETorPOST);
      RESTRequest.Params.AddItem('client_id', AClientID, TRESTRequestParameterKind.pkGETorPOST);
      RESTRequest.Params.AddItem('client_secret', AClientSecret, TRESTRequestParameterKind.pkGETorPOST);
      RESTRequest.Params.AddItem('resource', AResourceURI, TRESTRequestParameterKind.pkGETorPOST);
    
      RESTRequest.Execute;
    
      if RESTRequest.Response.GetSimpleValue('access_token', AToken) then
        OAuth2_Dynamics365.AccessToken := AToken;
    

    如上所述,ATentantIDAClientIDAClientSecretAResourceURI 值都可以从Azure 活动目录;来自其属性或已注册应用的属性。

    【讨论】:

      猜你喜欢
      • 2022-10-23
      • 2023-01-15
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 2011-04-14
      • 1970-01-01
      • 2018-05-12
      相关资源
      最近更新 更多