import 'reflect-metadata'; import { NextFunction, Request, Response } from 'express'; import Scope from '../constants/scope'; import Token from '../model/token'; import Store from '../store/store'; declare module 'express' { export interface Request { userId?: string; scope?: Scope[]; } } export const authorize = (store: Store): ((req: Request, res: Response, next: NextFunction) => void) => { return (req: Request, res: Response, next: NextFunction) => { const authHeader = req.headers.authorization; if (!authHeader) { res.status(401).send({ error: { status: 401, message: 'No token provided', }, }); return; } const token = store.get(authHeader); if (!token) { res.status(401).send({ error: { status: 401, message: 'Invalid access token', }, }); return; } if (token.expiryDate.getTime() < Date.now()) { res.status(401).send({ error: { status: 401, message: 'The access token expired', }, }); return; } req.userId = token.userId; req.scope = token.scope; next(); }; };