Oauth 2.0 如何使用OAuth 2.0将Delphi桌面应用程序连接到第三方Dynamics 365应用程序?

Oauth 2.0 如何使用OAuth 2.0将Delphi桌面应用程序连接到第三方Dynamics 365应用程序?,oauth-2.0,dynamics-crm,delphi-10.2-tokyo,Oauth 2.0,Dynamics Crm,Delphi 10.2 Tokyo,到目前为止,我找到的所有信息都是,桌面应用程序需要在Microsoft Azure Active Directory中注册,并且有一个名为ADAL的库,其中包含了所需的所有信息 但我想做的只是登录到已经在Dynamics上运行的第三方应用程序,然后使用REST方法读取该第三方应用程序提供的自定义数据 这有可能吗 如果推到紧要关头,我可以编写一个C#.NET DCOM包装类,然后将其导入Delphi以获得对ADAL功能的访问,但第三方Dynamics 365应用程序的开发人员希望自己控制访问

到目前为止,我找到的所有信息都是,桌面应用程序需要在Microsoft Azure Active Directory中注册,并且有一个名为ADAL的库,其中包含了所需的所有信息

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

这有可能吗

如果推到紧要关头,我可以编写一个C#.NET DCOM包装类,然后将其导入Delphi以获得对ADAL功能的访问,但第三方Dynamics 365应用程序的开发人员希望自己控制访问

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

但是为了了解可能需要什么,我创建了一个测试Google应用程序,完成了Google任务的登录过程,能够获取身份验证代码和访问令牌,然后获取任务列表,所以至少我知道我应该使用的OAuth 2.0机制正在工作

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

编辑:

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

编辑2:

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

要使其工作,我必须注册该应用程序,但必须注册到第三方Dynamics 365应用程序的广告域中。完成后,我可以创建一个公钥,该公钥将允许我获得Azure令牌,而无需作为特定的Dynamics 365用户登录

要使用的代码类似于以下代码:

  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;
ATentantID、AClientID、AClientSecret和AResourceURI值都可以从Azure Active Directory获得;从其属性或已注册应用程序的属性


然后从RESTRequest.Response对象中提取令牌。

当您的应用程序已正确注册和配置时,使用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;
如上所述,ATentantID、AClientID、AClientSecret和AResourceURI值都可以从Azure Active Directory获得;从其属性或已注册应用程序的属性