import { CanActivate, ExecutionContext, Inject, Injectable } from '@nestjs/common'; import { Request, Response } from 'express'; import * as jwt from 'jsonwebtoken'; import { TokensService } from '../Tokens/TokensService'; import { UsersService } from '../Users/UsersService'; /** * Principal Guard for protecting routes and automatically retrieving the users profile. */ @Injectable() export class PrincipalGuard implements CanActivate { public constructor(@Inject('UsersService') private readonly usersService: UsersService, @Inject('TokensService') private readonly tokensService: TokensService) { } /** * Called before a route is executed. * * @param {ExecutionContext} context * @returns {Promise} */ public canActivate(context: ExecutionContext): Promise { const ctx = context.switchToHttp(); const request = ctx.getRequest(); const response = ctx.getResponse(); console.log(request.query); console.log(request.query.jwt); console.log(process.env.JWT_SECRET); if (request.headers.authorization || request.query.jwt) { console.log(1); return new Promise(async (resolve, reject) => { if (request.query.jwt) { console.log(2); try { const decoded = jwt.verify((request.query as any).jwt, process.env.JWT_SECRET); const user = await this.usersService.getById(decoded['id']); if (user) { request['principal'] = user; resolve(true); } else { response.status(401); } } catch (e) { resolve(false); } } else { const split = request.headers.authorization.split(' '); console.log(split); if (split[0] == 'token') { const token = await this.tokensService.getByToken(split[1]).catch(() => { response.status(401); }); if (token) { request['principal'] = token.user; resolve(true); } else { response.status(401); } } else { try { console.log(split[1]); console.log(process.env.JWT_SECRET); const decoded = jwt.verify(split[1], process.env.JWT_SECRET); console.log(decoded); const user = await this.usersService.getById(decoded['id']); console.log(user); if (user) { request['principal'] = user; resolve(true); } else { response.status(401); resolve(false); } } catch (e) { console.log(e); console.log('fail'); response.status(401); resolve(false); } } } }); } else { response.status(401); } } }