Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

Azure REST API Access Token

See more Azure OAuth2 Examples

Demonstrates how to request an Azure REST API OAUTH2 access token.

Note: In order to access resources a Service Principal needs to be created in your Tenant. It is really convenient to do it via AZ CLI:

az ad sp create-for-rbac --name [APP_NAME] --password [CLIENT_SECRET]

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.Rest,
  Chilkat.JsonObject;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  rest: TRest;
  bTls: Boolean;
  port: Integer;
  bAutoReconnect: Boolean;
  strResponseBody: string;
  respStatusCode: Integer;
  json: TJsonObject;

begin
  success := False;

  //  This example requires the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  rest := TRest.Create;

  //  URL: https://login.microsoftonline.com/TENANT_ID/oauth2/token
  bTls := True;
  port := 443;
  bAutoReconnect := True;
  success := rest.Connect('login.microsoftonline.com',port,bTls,bAutoReconnect);
  if (success <> True) then
    begin
      WriteLn('ConnectFailReason: ' + rest.ConnectFailReason);
      WriteLn(rest.LastErrorText);
      Exit;
    end;

  //  Add query params to the request.
  rest.AddQueryParam('grant_type','client_credentials');
  rest.AddQueryParam('client_id','APP_ID');
  rest.AddQueryParam('client_secret','CLIENT_SECRET');
  //  Note: The resource must match the API for which you're using the access token..
  rest.AddQueryParam('resource','https://management.azure.com/');

  strResponseBody := rest.FullRequestFormUrlEncoded('POST','/TENANT_ID/oauth2/token');
  if (rest.LastMethodSuccess <> True) then
    begin
      WriteLn(rest.LastErrorText);
      Exit;
    end;
  respStatusCode := rest.ResponseStatusCode;
  if (respStatusCode >= 400) then
    begin
      WriteLn('Response Status Code = ' + respStatusCode);
      WriteLn('Response Header:');
      WriteLn(rest.ResponseHeader);
      WriteLn('Response Body:');
      WriteLn(strResponseBody);
      Exit;
    end;

  json := TJsonObject.Create;
  json.Load(strResponseBody);
  json.EmitCompact := False;
  WriteLn(json.Emit());

  //  The result is an access token such as the following:

  //  {
  //    "token_type": "Bearer",
  //    "expires_in": "3600",
  //    "ext_expires_in": "3600",
  //    "expires_on": "1557864616",
  //    "not_before": "1557860716",
  //    "resource": "https://management.azure.com/",
  //    "access_token": "eyJ0eXAiOiJKV1QiL ... 20UFDDOHEyUg"
  //  }

  //  We'll save this JSON to a file for other examples to use..
  json.WriteFile('qa_data/tokens/azureToken.json');


  rest.Free;
  json.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.