@coolgk/utils
Version:
javascript, typescript utility and wrapper functions and classes: array, string, base64, ampq, bcrypt, cache, captcha, csv, email, jwt, number, pdf, tmp, token, unit conversion, url params, session, form data, google sign in, facebook sign in
59 lines (57 loc) • 2 kB
JavaScript
/*!
* @package @coolgk/utils
* @version 3.1.4
* @link https://github.com/coolgk/node-utils
* @license MIT
* @author Daniel Gong <daniel.k.gong@gmail.com>
*
* Copyright (c) 2017 Daniel Gong <daniel.k.gong@gmail.com>. All rights reserved.
* Licensed under the MIT License.
*/
;
/*!
* Copyright (c) 2017 Daniel Gong <daniel.k.gong@gmail.com>. All rights reserved.
* Licensed under the MIT License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
const crypto_1 = require("crypto");
const base64_1 = require("@coolgk/base64");
var JwtError;
(function (JwtError) {
JwtError["SECRET_CANNOT_BE_EMPTY"] = "SECRET_CANNOT_BE_EMPTY";
})(JwtError = exports.JwtError || (exports.JwtError = {}));
class Jwt {
constructor(options) {
if (!options || !options.secret) {
throw new Error(JwtError.SECRET_CANNOT_BE_EMPTY);
}
this._secret = options.secret;
}
generate(data, expiry) {
const issuedAt = Date.now();
const payload = base64_1.encodeUrl(JSON.stringify({
exp: expiry ? expiry + issuedAt : 0,
iat: issuedAt,
rng: Math.random(),
data
}));
return payload + '.' + encodeURIComponent(crypto_1.createHmac('sha256', this._secret).update(payload).digest('base64'));
}
verify(token = '') {
const [unsignedToken, tokenSignature] = token.split('.');
try {
const payload = JSON.parse(base64_1.decodeUrl(unsignedToken));
const signature = crypto_1.createHmac('sha256', this._secret).update(unsignedToken).digest('base64');
return (payload.exp === 0 || payload.exp >= Date.now())
&& signature === decodeURIComponent(tokenSignature) ? payload : false;
}
catch (error) {
if (error.message.indexOf('JSON') === -1) {
throw error;
}
return false;
}
}
}
exports.Jwt = Jwt;
exports.default = Jwt;