UNPKG

payload

Version:

Node, React and MongoDB Headless CMS and Application Framework

119 lines (118 loc) • 15.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "default", { enumerable: true, get: function() { return _default; } }); const _jsonwebtoken = /*#__PURE__*/ _interop_require_default(require("jsonwebtoken")); const _url = /*#__PURE__*/ _interop_require_default(require("url")); const _utils = require("../../collections/operations/utils"); const _errors = require("../../errors"); const _commitTransaction = require("../../utilities/commitTransaction"); const _getCookieExpiration = /*#__PURE__*/ _interop_require_default(require("../../utilities/getCookieExpiration")); const _initTransaction = require("../../utilities/initTransaction"); const _killTransaction = require("../../utilities/killTransaction"); const _getFieldsToSign = require("./getFieldsToSign"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } async function refresh(incomingArgs) { let args = incomingArgs; try { const shouldCommit = await (0, _initTransaction.initTransaction)(args.req); // ///////////////////////////////////// // beforeOperation - Collection // ///////////////////////////////////// await args.collection.config.hooks.beforeOperation.reduce(async (priorHook, hook)=>{ await priorHook; args = await hook({ args, collection: args.collection?.config, context: args.req.context, operation: 'refresh', req: args.req }) || args; }, Promise.resolve()); // ///////////////////////////////////// // Refresh // ///////////////////////////////////// const { collection: { config: collectionConfig }, req: { payload: { config, secret } } } = args; if (typeof args.token !== 'string' || !args.req.user) throw new _errors.Forbidden(args.req.t); const parsedURL = _url.default.parse(args.req.url); const isGraphQL = parsedURL.pathname === config.routes.graphQL; const user = await args.req.payload.findByID({ id: args.req.user.id, collection: args.req.user.collection, depth: isGraphQL ? 0 : args.collection.config.auth.depth, req: args.req }); const fieldsToSign = (0, _getFieldsToSign.getFieldsToSign)({ collectionConfig, email: user?.email, user: args?.req?.user }); const refreshedToken = _jsonwebtoken.default.sign(fieldsToSign, secret, { expiresIn: collectionConfig.auth.tokenExpiration }); const exp = _jsonwebtoken.default.decode(refreshedToken).exp; if (args.res) { const cookieOptions = { domain: undefined, expires: (0, _getCookieExpiration.default)(collectionConfig.auth.tokenExpiration), httpOnly: true, path: '/', sameSite: collectionConfig.auth.cookies.sameSite, secure: collectionConfig.auth.cookies.secure }; if (collectionConfig.auth.cookies.domain) cookieOptions.domain = collectionConfig.auth.cookies.domain; args.res.cookie(`${config.cookiePrefix}-token`, refreshedToken, cookieOptions); } let result = { exp, refreshedToken, user }; // ///////////////////////////////////// // After Refresh - Collection // ///////////////////////////////////// await collectionConfig.hooks.afterRefresh.reduce(async (priorHook, hook)=>{ await priorHook; result = await hook({ collection: args.collection?.config, context: args.req.context, exp, req: args.req, res: args.res, token: refreshedToken }) || result; }, Promise.resolve()); // ///////////////////////////////////// // afterOperation - Collection // ///////////////////////////////////// result = await (0, _utils.buildAfterOperation)({ args, collection: args.collection?.config, operation: 'refresh', result }); // ///////////////////////////////////// // Return results // ///////////////////////////////////// if (collectionConfig.auth.removeTokenFromResponses) { delete result.refreshedToken; } if (shouldCommit) await (0, _commitTransaction.commitTransaction)(args.req); return result; } catch (error) { await (0, _killTransaction.killTransaction)(args.req); throw error; } } const _default = refresh; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdXRoL29wZXJhdGlvbnMvcmVmcmVzaC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcydcblxuaW1wb3J0IGp3dCBmcm9tICdqc29ud2VidG9rZW4nXG5pbXBvcnQgdXJsIGZyb20gJ3VybCdcblxuaW1wb3J0IHR5cGUgeyBCZWZvcmVPcGVyYXRpb25Ib29rLCBDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vY29sbGVjdGlvbnMvY29uZmlnL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkUmVxdWVzdCB9IGZyb20gJy4uLy4uL2V4cHJlc3MvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IERvY3VtZW50IH0gZnJvbSAnLi4vLi4vdHlwZXMnXG5cbmltcG9ydCB7IGJ1aWxkQWZ0ZXJPcGVyYXRpb24gfSBmcm9tICcuLi8uLi9jb2xsZWN0aW9ucy9vcGVyYXRpb25zL3V0aWxzJ1xuaW1wb3J0IHsgRm9yYmlkZGVuIH0gZnJvbSAnLi4vLi4vZXJyb3JzJ1xuaW1wb3J0IHsgY29tbWl0VHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvY29tbWl0VHJhbnNhY3Rpb24nXG5pbXBvcnQgZ2V0Q29va2llRXhwaXJhdGlvbiBmcm9tICcuLi8uLi91dGlsaXRpZXMvZ2V0Q29va2llRXhwaXJhdGlvbidcbmltcG9ydCB7IGluaXRUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9pbml0VHJhbnNhY3Rpb24nXG5pbXBvcnQgeyBraWxsVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi91dGlsaXRpZXMva2lsbFRyYW5zYWN0aW9uJ1xuaW1wb3J0IHsgZ2V0RmllbGRzVG9TaWduIH0gZnJvbSAnLi9nZXRGaWVsZHNUb1NpZ24nXG5cbmV4cG9ydCB0eXBlIFJlc3VsdCA9IHtcbiAgZXhwOiBudW1iZXJcbiAgcmVmcmVzaGVkVG9rZW46IHN0cmluZ1xuICB1c2VyOiBEb2N1bWVudFxufVxuXG5leHBvcnQgdHlwZSBBcmd1bWVudHMgPSB7XG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb25cbiAgcmVxOiBQYXlsb2FkUmVxdWVzdFxuICByZXM/OiBSZXNwb25zZVxuICB0b2tlbjogc3RyaW5nXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlZnJlc2goaW5jb21pbmdBcmdzOiBBcmd1bWVudHMpOiBQcm9taXNlPFJlc3VsdD4ge1xuICBsZXQgYXJncyA9IGluY29taW5nQXJnc1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgc2hvdWxkQ29tbWl0ID0gYXdhaXQgaW5pdFRyYW5zYWN0aW9uKGFyZ3MucmVxKVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIGJlZm9yZU9wZXJhdGlvbiAtIENvbGxlY3Rpb25cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICBhd2FpdCBhcmdzLmNvbGxlY3Rpb24uY29uZmlnLmhvb2tzLmJlZm9yZU9wZXJhdGlvbi5yZWR1Y2UoXG4gICAgICBhc3luYyAocHJpb3JIb29rOiBCZWZvcmVPcGVyYXRpb25Ib29rIHwgUHJvbWlzZTx2b2lkPiwgaG9vazogQmVmb3JlT3BlcmF0aW9uSG9vaykgPT4ge1xuICAgICAgICBhd2FpdCBwcmlvckhvb2tcblxuICAgICAgICBhcmdzID1cbiAgICAgICAgICAoYXdhaXQgaG9vayh7XG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgY29sbGVjdGlvbjogYXJncy5jb2xsZWN0aW9uPy5jb25maWcsXG4gICAgICAgICAgICBjb250ZXh0OiBhcmdzLnJlcS5jb250ZXh0LFxuICAgICAgICAgICAgb3BlcmF0aW9uOiAncmVmcmVzaCcsXG4gICAgICAgICAgICByZXE6IGFyZ3MucmVxLFxuICAgICAgICAgIH0pKSB8fCBhcmdzXG4gICAgICB9LFxuICAgICAgUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgKVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIFJlZnJlc2hcbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICBjb25zdCB7XG4gICAgICBjb2xsZWN0aW9uOiB7IGNvbmZpZzogY29sbGVjdGlvbkNvbmZpZyB9LFxuICAgICAgcmVxOiB7XG4gICAgICAgIHBheWxvYWQ6IHsgY29uZmlnLCBzZWNyZXQgfSxcbiAgICAgIH0sXG4gICAgfSA9IGFyZ3NcblxuICAgIGlmICh0eXBlb2YgYXJncy50b2tlbiAhPT0gJ3N0cmluZycgfHwgIWFyZ3MucmVxLnVzZXIpIHRocm93IG5ldyBGb3JiaWRkZW4oYXJncy5yZXEudClcblxuICAgIGNvbnN0IHBhcnNlZFVSTCA9IHVybC5wYXJzZShhcmdzLnJlcS51cmwpXG4gICAgY29uc3QgaXNHcmFwaFFMID0gcGFyc2VkVVJMLnBhdGhuYW1lID09PSBjb25maWcucm91dGVzLmdyYXBoUUxcblxuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCBhcmdzLnJlcS5wYXlsb2FkLmZpbmRCeUlEKHtcbiAgICAgIGlkOiBhcmdzLnJlcS51c2VyLmlkLFxuICAgICAgY29sbGVjdGlvbjogYXJncy5yZXEudXNlci5jb2xsZWN0aW9uLFxuICAgICAgZGVwdGg6IGlzR3JhcGhRTCA/IDAgOiBhcmdzLmNvbGxlY3Rpb24uY29uZmlnLmF1dGguZGVwdGgsXG4gICAgICByZXE6IGFyZ3MucmVxLFxuICAgIH0pXG5cbiAgICBjb25zdCBmaWVsZHNUb1NpZ24gPSBnZXRGaWVsZHNUb1NpZ24oe1xuICAgICAgY29sbGVjdGlvbkNvbmZpZyxcbiAgICAgIGVtYWlsOiB1c2VyPy5lbWFpbCBhcyBzdHJpbmcsXG4gICAgICB1c2VyOiBhcmdzPy5yZXE/LnVzZXIsXG4gICAgfSlcblxuICAgIGNvbnN0IHJlZnJlc2hlZFRva2VuID0gand0LnNpZ24oZmllbGRzVG9TaWduLCBzZWNyZXQsIHtcbiAgICAgIGV4cGlyZXNJbjogY29sbGVjdGlvbkNvbmZpZy5hdXRoLnRva2VuRXhwaXJhdGlvbixcbiAgICB9KVxuXG4gICAgY29uc3QgZXhwID0gKGp3dC5kZWNvZGUocmVmcmVzaGVkVG9rZW4pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5leHAgYXMgbnVtYmVyXG5cbiAgICBpZiAoYXJncy5yZXMpIHtcbiAgICAgIGNvbnN0IGNvb2tpZU9wdGlvbnMgPSB7XG4gICAgICAgIGRvbWFpbjogdW5kZWZpbmVkLFxuICAgICAgICBleHBpcmVzOiBnZXRDb29raWVFeHBpcmF0aW9uKGNvbGxlY3Rpb25Db25maWcuYXV0aC50b2tlbkV4cGlyYXRpb24pLFxuICAgICAgICBodHRwT25seTogdHJ1ZSxcbiAgICAgICAgcGF0aDogJy8nLFxuICAgICAgICBzYW1lU2l0ZTogY29sbGVjdGlvbkNvbmZpZy5hdXRoLmNvb2tpZXMuc2FtZVNpdGUsXG4gICAgICAgIHNlY3VyZTogY29sbGVjdGlvbkNvbmZpZy5hdXRoLmNvb2tpZXMuc2VjdXJlLFxuICAgICAgfVxuXG4gICAgICBpZiAoY29sbGVjdGlvbkNvbmZpZy5hdXRoLmNvb2tpZXMuZG9tYWluKVxuICAgICAgICBjb29raWVPcHRpb25zLmRvbWFpbiA9IGNvbGxlY3Rpb25Db25maWcuYXV0aC5jb29raWVzLmRvbWFpblxuXG4gICAgICBhcmdzLnJlcy5jb29raWUoYCR7Y29uZmlnLmNvb2tpZVByZWZpeH0tdG9rZW5gLCByZWZyZXNoZWRUb2tlbiwgY29va2llT3B0aW9ucylcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0OiBSZXN1bHQgPSB7XG4gICAgICBleHAsXG4gICAgICByZWZyZXNoZWRUb2tlbixcbiAgICAgIHVzZXIsXG4gICAgfVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIEFmdGVyIFJlZnJlc2ggLSBDb2xsZWN0aW9uXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgYXdhaXQgY29sbGVjdGlvbkNvbmZpZy5ob29rcy5hZnRlclJlZnJlc2gucmVkdWNlKGFzeW5jIChwcmlvckhvb2ssIGhvb2spID0+IHtcbiAgICAgIGF3YWl0IHByaW9ySG9va1xuXG4gICAgICByZXN1bHQgPVxuICAgICAgICAoYXdhaXQgaG9vayh7XG4gICAgICAgICAgY29sbGVjdGlvbjogYXJncy5jb2xsZWN0aW9uPy5jb25maWcsXG4gICAgICAgICAgY29udGV4dDogYXJncy5yZXEuY29udGV4dCxcbiAgICAgICAgICBleHAsXG4gICAgICAgICAgcmVxOiBhcmdzLnJlcSxcbiAgICAgICAgICByZXM6IGFyZ3MucmVzLFxuICAgICAgICAgIHRva2VuOiByZWZyZXNoZWRUb2tlbixcbiAgICAgICAgfSkpIHx8IHJlc3VsdFxuICAgIH0sIFByb21pc2UucmVzb2x2ZSgpKVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIGFmdGVyT3BlcmF0aW9uIC0gQ29sbGVjdGlvblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIHJlc3VsdCA9IGF3YWl0IGJ1aWxkQWZ0ZXJPcGVyYXRpb24oe1xuICAgICAgYXJncyxcbiAgICAgIGNvbGxlY3Rpb246IGFyZ3MuY29sbGVjdGlvbj8uY29uZmlnLFxuICAgICAgb3BlcmF0aW9uOiAncmVmcmVzaCcsXG4gICAgICByZXN1bHQsXG4gICAgfSlcblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBSZXR1cm4gcmVzdWx0c1xuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIGlmIChjb2xsZWN0aW9uQ29uZmlnLmF1dGgucmVtb3ZlVG9rZW5Gcm9tUmVzcG9uc2VzKSB7XG4gICAgICBkZWxldGUgcmVzdWx0LnJlZnJlc2hlZFRva2VuXG4gICAgfVxuXG4gICAgaWYgKHNob3VsZENvbW1pdCkgYXdhaXQgY29tbWl0VHJhbnNhY3Rpb24oYXJncy5yZXEpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgYXdhaXQga2lsbFRyYW5zYWN0aW9uKGFyZ3MucmVxKVxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgcmVmcmVzaFxuIl0sIm5hbWVzIjpbInJlZnJlc2giLCJpbmNvbWluZ0FyZ3MiLCJhcmdzIiwic2hvdWxkQ29tbWl0IiwiaW5pdFRyYW5zYWN0aW9uIiwicmVxIiwiY29sbGVjdGlvbiIsImNvbmZpZyIsImhvb2tzIiwiYmVmb3JlT3BlcmF0aW9uIiwicmVkdWNlIiwicHJpb3JIb29rIiwiaG9vayIsImNvbnRleHQiLCJvcGVyYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsImNvbGxlY3Rpb25Db25maWciLCJwYXlsb2FkIiwic2VjcmV0IiwidG9rZW4iLCJ1c2VyIiwiRm9yYmlkZGVuIiwidCIsInBhcnNlZFVSTCIsInVybCIsInBhcnNlIiwiaXNHcmFwaFFMIiwicGF0aG5hbWUiLCJyb3V0ZXMiLCJncmFwaFFMIiwiZmluZEJ5SUQiLCJpZCIsImRlcHRoIiwiYXV0aCIsImZpZWxkc1RvU2lnbiIsImdldEZpZWxkc1RvU2lnbiIsImVtYWlsIiwicmVmcmVzaGVkVG9rZW4iLCJqd3QiLCJzaWduIiwiZXhwaXJlc0luIiwidG9rZW5FeHBpcmF0aW9uIiwiZXhwIiwiZGVjb2RlIiwicmVzIiwiY29va2llT3B0aW9ucyIsImRvbWFpbiIsInVuZGVmaW5lZCIsImV4cGlyZXMiLCJnZXRDb29raWVFeHBpcmF0aW9uIiwiaHR0cE9ubHkiLCJwYXRoIiwic2FtZVNpdGUiLCJjb29raWVzIiwic2VjdXJlIiwiY29va2llIiwiY29va2llUHJlZml4IiwicmVzdWx0IiwiYWZ0ZXJSZWZyZXNoIiwiYnVpbGRBZnRlck9wZXJhdGlvbiIsInJlbW92ZVRva2VuRnJvbVJlc3BvbnNlcyIsImNvbW1pdFRyYW5z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