JWT token
by Csaba Hellinger
February 14, 2019
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