Sample C# Script: Generate Signature

Creation date: 6/12/2022 9:47 AM    Updated: 1/24/2023 11:46 AM
This code shows an example of how to generate a signature for API requests. It assumes a token for a user has already been received. Requesting the token for a user is outside of the scope of this article.

using System;
using System.Text;
using System.Security.Cryptography;
using System.Collections.Generic;
					
public class Program
{
	/**
	 * SignData
	 * 
	 * Takes a sorted list and token, returns a base 64 encoded signature of the list
	 * stringified and hmac md5 encoded using the token.
	 */
	public static string SignData(SortedList<string, string> data, string token)
	{
		// create our HMACMD5 object using the token as it's key
		HMACMD5 hmacMD5 = new HMACMD5(Encoding.UTF8.GetBytes(token));
		
		// stringify the data
		string toSign = "";
		foreach (KeyValuePair<string, string> kvp in data)
		{
			toSign += kvp.Key + "=" + kvp.Value;
		}
		
		// compute the hash for the stringified data and base 64 encode the hash
		byte[] hash = hmacMD5.ComputeHash(Encoding.UTF8.GetBytes(toSign));
		string signature = Convert.ToBase64String(hash);
		
		// remove all trailing equal signs (=) and return the signature
		return signature.TrimEnd('=');
	}
	
	public static void Main()
	{
		// Angelfish user account making the api request
		string username = "USERNAME";
		
		// the authentication token assigned to the user
		string token = "TOKEN";
		
		// the post data used for the api request, sorted
		SortedList<string, string> postRequestData = new SortedList<string, string>();
		postRequestData["dimensions"] = "source";
		postRequestData["metrics"] = "visits";
		postRequestData["ids"] = "1234";
		postRequestData["username"] = username;
		
		// add the signature to the data
		postRequestData["signature"] = SignData(postRequestData, token);
		
		// This is where you would use the post data for your request. For purposes
		// of this example, we simply print the signature.
		Console.WriteLine(postRequestData["signature"]);
	}
}