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

Get Access Token using a Pre-Created JSON Web Token

See more ABN AMRO Examples

Demonstrates how to get an access token using a pre-created JSON Web Token (JWT).

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.Jwt,
  Chilkat.HttpResponse,
  Chilkat.HttpRequest,
  Chilkat.JsonObject,
  Chilkat.PrivateKey,
  Chilkat.Http;

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

procedure RunDemo;
var
  success: Boolean;
  privkey: TPrivateKey;
  jwt: TJwt;
  jsonHeader: TJsonObject;
  jsonPayload: TJsonObject;
  curDateTime: Integer;
  jwtStr: string;
  http: THttp;
  req: THttpRequest;
  resp: THttpResponse;
  json: TJsonObject;

begin
  success := False;

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

  //  We're going to duplicate this CURL statement:
  //  curl -X POST https://api-sandbox.abnamro.com/v1/oauth/token \
  //  -H "Content-Type: application/x-www-form-urlencoded" \
  //  -H "API-Key: xxxxxx" \
  //  -d 'client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&grant_type=client_credentials&client_assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ4eHh4eHgiLCJleHAiOiIxNDk5OTQ3NjY4IiwiaXNzIjoibWUiLCJhdWQiOiJodHRwczovL2F1dGgtc2FuZGJveC5hYm5hbXJvLmNvbS9vYXV0aC90b2tlbiJ9.jGwHKG_YjgKpR8NPpaLu6nJ97obeP2vcxg6fOWBKdJ0&scope=tikkie'

  //  Load our pre-creaed private key PEM file.
  //  Note: Please share your public key along with your app name and developer email id at api.support@nl.abnamro.com. 
  //  Token generation will not work unless public key is associated with your app.
  privkey := TPrivateKey.Create;

  success := privkey.LoadPemFile('qa_data/pem/abnAmroPrivateKey.pem');
  if (success = False) then
    begin
      WriteLn(privkey.LastErrorText);
      Exit;
    end;

  //  Create the JWT.
  jwt := TJwt.Create;

  //  Create the header:
  //  {
  //      "typ": "JWT",
  //      "alg": "RS256"
  //  }
  jsonHeader := TJsonObject.Create;
  jsonHeader.UpdateString('typ','JWT');
  jsonHeader.UpdateString('alg','RS256');

  //  Create the payload:
  //  {
  //      "nbf": 1499947668,
  //      "exp": 1499948668,
  //      "iss": "me",
  //      "sub": "anApiKey",
  //      "aud": "https://auth-sandbox.abnamro.com/oauth/token"
  //  }
  jsonPayload := TJsonObject.Create;

  curDateTime := jwt.GenNumericDate(0);

  //  Set the "not process before" timestamp to now.
  success := jsonPayload.AddIntAt(-1,'nbf',curDateTime);

  //  Set the timestamp defining an expiration time (end time) for the token
  //  to be now + 1 hour (3600 seconds)
  success := jsonPayload.AddIntAt(-1,'exp',curDateTime + 3600);

  jsonPayload.UpdateString('iss','me');
  jsonPayload.UpdateString('sub','anApiKey');
  jsonPayload.UpdateString('aud','https://auth-sandbox.abnamro.com/oauth/token');

  //  Produce the smallest possible JWT:
  jwt.AutoCompact := True;

  jwtStr := jwt.CreateJwtPk(jsonHeader.Emit(),jsonPayload.Emit(),privkey);
  if (jwt.LastMethodSuccess = False) then
    begin
      WriteLn(jwt.LastErrorText);
      Exit;
    end;

  http := THttp.Create;

  req := THttpRequest.Create;
  req.AddParam('client_assertion_type','urn:ietf:params:oauth:client-assertion-type:jwt-bearer');
  req.AddParam('grant_type','client_credentials');
  req.AddParam('client_assertion',jwtStr);
  req.AddParam('scope','tikkie');

  req.HttpVerb := 'POST';
  req.ContentType := 'application/x-www-form-urlencoded';

  resp := THttpResponse.Create;
  success := http.HttpReq('https://api-sandbox.abnamro.com/v1/oauth/token',req,resp);
  if (success = False) then
    begin
      WriteLn(http.LastErrorText);
      Exit;
    end;

  if (resp.StatusCode <> 200) then
    begin
      WriteLn(resp.BodyStr);
      Exit;
    end;

  //  Get the JSON result:
  //  {
  //      "access_token": "{your access token}",
  //      "expires_in": "{duration of validity in seconds}",
  //      "scope": "{scope(s) for which the access token is valid}",
  //      "token_type": "{it is always Bearer}"
  //  }
  json := TJsonObject.Create;
  json.Load(resp.BodyStr);
  WriteLn('access_token: ' + json.StringOf('access_token'));
  WriteLn('token_type: ' + json.StringOf('token_type'));
  WriteLn('expires_in: ' + json.StringOf('expires_in'));
  WriteLn('scope: ' + json.StringOf('scope'));


  privkey.Free;
  jwt.Free;
  jsonHeader.Free;
  jsonPayload.Free;
  http.Free;
  req.Free;
  resp.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.