UNPKG

secure-link

Version:

Functions to generate and validate resource access tokens.

63 lines (48 loc) 1.59 kB
const { parse } = require('url'); const generateNginxAccessToken = require('./generateNginxAccessToken'); const errors = require('../utils/errors'); /** * Middleware to validate generated access tokens * @param {Object} [options] Configuration for token validation * @return {Function} Middleware with closure over options */ const validateResourceAccessToken = (middlewareOptions = {}) => { const { secret, algorithm, tokenParameterName, expiresParamaterName } = middlewareOptions; if (!secret) { throw new Error(errors.missingSecret); } if (!tokenParameterName) { throw new Error(errors.missingTokenParameterName); } if (!expiresParamaterName) { throw new Error(errors.missingExpiresParamaterName); } return (req, res, next) => { const receivedToken = req.query[tokenParameterName]; const receivedExpires = req.query[expiresParamaterName]; if (!receivedToken || !receivedExpires) { return res.status(403).end(); } const { pathname } = parse(req.originalUrl); const options = { secret: secret, algorithm: algorithm ? algorithm : 'md5', resourcePath: pathname, expirationTime: receivedExpires }; const checksumToken = generateNginxAccessToken(options); if (checksumToken === receivedToken && receivedExpires > Date.now()) { return next(); } else if (checksumToken !== receivedToken) { return res.status(403).end(); } // Token has expired - 'Gone' return res.status(410).end(); }; }; module.exports = validateResourceAccessToken;