Example: C#
The following code is an example of how to generate access tokens in C#.
using System;
using System.Text;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Web.Script.Serialization;
namespace VxTokenGenerator
{
class TokenGenerator
{
static void Main(string[] args)
{
Console.WriteLine(vxGenerateToken("secret", "issuer", 1559359105, "join", 123456, "sip:.username.@domain.vivox.com", "sip:confctl-g-channelname@domain.vivox.com"));
}
static string vxGenerateToken(string key, string issuer, int exp, string vxa, int vxi, string f, string t)
{
var claims = new Claims
{
iss = issuer,
exp = exp,
vxa = vxa,
vxi = vxi,
f = f,
t = t
};
List<string> segments = new List<string>();
// Header is static - base64url encoded {} - Can also be defined as a constant "e30"
var header = Base64URLEncode("{}");
segments.Add(header);
// Encode payload
var claimsString = new JavaScriptSerializer().Serialize(claims);
var encodedClaims = Base64URLEncode(claimsString);
// Join segments to prepare for signing
segments.Add(encodedClaims);
string toSign = String.Join(".", segments);
// Sign token with key and SHA256
string sig = SHA256Hash(key, toSign);
segments.Add(sig);
// Join all 3 parts of token with . and return
string token = String.Join(".", segments);
return token;
}
private static string Base64URLEncode(string plainText)
{
var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
// Remove padding at the end
var encodedString = System.Convert.ToBase64String(plainTextBytes).TrimEnd('=');
// Substitute URL-safe characters
string urlEncoded = encodedString.Replace("+", "-").Replace("/", "_");
return urlEncoded;
}
private static string SHA256Hash(string secret, string message)
{
var encoding = new System.Text.ASCIIEncoding();
byte[] keyByte = encoding.GetBytes(secret);
byte[] messageBytes = encoding.GetBytes(message);
// The instance of HMACSHA256 is constructed and disposed in this method because it is not thread safe
using (var hmacsha256 = new HMACSHA256(keyByte))
{
byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
var hashString = Convert.ToBase64String(hashmessage).TrimEnd('=');
string urlEncoded = hashString.Replace("+", "-").Replace("/", "_");
return urlEncoded;
}
}
public class Claims
{
public string iss { get; set; }
public int exp { get; set; }
public string vxa { get; set; }
public int vxi { get; set; }
public string f { get; set; }
public string t { get; set; }
public string sub { get; set; }
}
}
}