Base64-encoded credentials

Sometimes when you are connecting to a web service you need to authenticate using Base64 encoded credentials. This has became a lot easier now that we can use .Net

Here’s some sample code that connects to a web service with “username:password” but encoded as Base64. This code use a method to get a response which is saved in the XML document variable.

Name		DataType	Subtype	Length
HttpWebResponse	DotNet		System.Net.HttpWebResponse.'System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'	
HttpWebRequest	DotNet		System.Net.HttpWebRequest.'System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'	
MemoryStream	DotNet		System.IO.MemoryStream.'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'	
XMLDoc		DotNet		System.Xml.XmlDocument.'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'	
Convert		DotNet		System.Convert.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'	
Bytes		DotNet		System.Array.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'	
UnicodeText	DotNet		System.Text.ASCIIEncoding.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'	

MySetupTable.GET; //Some kind of setup table

MySetupTable.TESTFIELD(Username);
MySetupTable.TESTFIELD(Password);
UnicodeText := UnicodeText.ASCIIEncoding;
Bytes := UnicodeText.GetBytes(MySetupTable.Username + ':' + MySetupTable.Password); //Example of credential syntax
HttpWebRequest := HttpWebRequest.Create(MySetupTable.URL);
HttpWebRequest.Method := MyMethod; //Some textstring defining what data to get e.g. 'invoices'
HttpWebRequest.ContentType := 'application/xml';
HttpWebRequest.Accept := 'application/xml';
HttpWebRequest.Headers.Add('Authorization', 'Basic ' + Convert.ToBase64String(Bytes));
HttpWebResponse := HttpWebRequest.GetResponse; //Here we execute the actual web service call
MemoryStream := HttpWebResponse.GetResponseStream; //Load the response to the Memory Stream

IF HttpWebResponse.StatusCode = 200 THEN
  BEGIN
    CLEAR(TempBlob);
    XMLDoc := XMLDoc.XmlDocument;
    XMLDoc.Load(MemoryStream); //Here we load the XML document with the response
    MemoryStream.Flush;
    MemoryStream.Close;
  END
ELSE
  ERROR('Something went wrong')

If we are in classic runtime and cannot use .Net we need to be a bit more creative. There’s a function in an automation object for Commerce Gateway that can encode a text file and put the result in an XML Dome Document Node. So if we create a text file and encode it we can read the encoded node value. I wouldn’t do this at runtime on every web service call, so in the example below the encoded username/password is stored in a setup table.

Name		DataType	Subtype	Length
CGBase64	Automation	'CG Request Client'.Base64	
DOMNode		Automation	'Microsoft XML, v3.0'.IXMLDOMNode	
DOMDoc		Automation	'Microsoft XML, v3.0'.DOMDocument	
TempFile	File		
FileName	Text		1024

IF (Username <> '') AND (Password <> '') THEN
  BEGIN
    TempFile.CREATETEMPFILE;
    FileName := TempFile.NAME;
    TempFile.CREATE(FileName);
    TempFile.WRITE(Username + ':' + Password);
    TempFile.CLOSE;

    CREATE(CGBase64);
    CREATE(DOMDoc);
    DOMNode := DOMDoc.createElement('b64'); // just a dummy to do the conversion
    CGBase64.Encode(FileName, DOMNode);
    "Base64 Username/password" := DOMNode.nodeTypedValue;
    CLEAR(DOMNode);
    CLEAR(DOMDoc);
    CLEAR(CGBase64);
  END
ELSE
  CLEAR("Base64 Username/password");

Tags: ,

No comments yet.

Leave a Reply