JWT token

by Csaba Hellinger

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/hmac-sha256.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/enc-base64-min.js"></script>
Results logged to the console.

JavaScript

const appSecret = '111'; // from Cleeng Dashboard
const appId = '222';     // from Cleeng Dashboard
const userId = '333'
const expire = 60 * 60 * 24;  // 1 day - how much should it be?

const header = {
	alg: 'HS256',
  typ: 'JWT'
};

const payload = {
	iss: appId,
	sub: "viewer", 
	user: userId,
	exp: 1550225604 // Math.floor(Date.now() / 1000) + expire
};

const base64url = bytes => {
  // Encode in classical base64
  let encodedSource = CryptoJS.enc.Base64.stringify(bytes);
  // Remove padding equal characters
  encodedSource = encodedSource.replace(/=+$/, '');
  // Replace characters according to base64url specifications
  encodedSource = encodedSource.replace(/\+/g, '-');
  encodedSource = encodedSource.replace(/\//g, '_');
  return encodedSource;
}

const encodeObj = obj => {
  // Stringify to JSON
  const json = JSON.stringify(obj);
  // Convert to UTF-8 byte array
  const bytes = CryptoJS.enc.Utf8.parse(json);
  // Encode in Base64URL
  const base64 = base64url(bytes);
  return base64;
}

const token = encodeObj(header) + '.' + encodeObj(payload);
const signature = base64url(CryptoJS.HmacSHA256(token, appSecret));
const signedToken = token + '.' + signature;


console.clear();
console.log(signedToken);

// To verify the token: https://jwt.io