UNPKG

@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
/*! * @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. */ "use strict"; /*! * 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;