const crypto = require('crypto');
const header = { alg: 'HS256', typ: 'JWT' }, data = { a: 1 b: 2 }, secret = 'secret';
assert(isValidJwt(makeJwt(header, data, secret), secret));
function makeJwt (header, data, secret) {
const base64Header = objToBase64(header);
base64Data = objToBase64(data),
base64Signature = jwtSignature(base64Header, base64Data, secret);
return base64Header + '.' + base64Data + '.' base64Signature;
}
function isValidJwt (jwt, secret) {
const [base64Header, base64Data, base64Signature] = jwt.split('.');
return base64Signature === jwtSignature(base64Header, base64Data, secret);
}
function jwtSignature (base64Header, base64Data, secret) {
return crypto
.createHmac('sha256', secret)
.update(base64Header + '.' + base64Data)
.digest('base64');
}
function objToBase64 (obj) {
return Buffer.from(JSON.stringify(obj), 'utf8').toString('base64');
}EVP_SignInit_ex() method with EVP_sha256() for the type argument.