import { ExecutionContext, Injectable } from '@nestjs/common' import { isNil } from 'lodash' import { AuthenticationService } from '../services/authentication/authentication.service' import { extractBearerToken } from '../utils' import { BasicAuthorizationGuard } from './basic_authorization.guard' @Injectable() export class JWTOrBasicAuthorizationGuard extends BasicAuthorizationGuard { constructor(private readonly authenticationService: AuthenticationService) { super() } async canActivate(context: ExecutionContext): Promise { const request = context.switchToHttp().getRequest() const token = extractBearerToken(request) try { const jsonBuffer = Buffer.from(token.split('.')[1], 'base64') const data = this.convertbufferToObject(jsonBuffer) const user = await this.authenticationService.getUser(data['user_id']) return !isNil(user) } catch (error) { return super.canActivate(context) } } private convertbufferToObject = (buffer: Buffer): { user_id?: string } => { let data: { user_id?: string } try { data = JSON.parse(buffer.toString('ascii')) } catch (error) { data = JSON.parse(buffer.toString('utf8')) } return data } }