import JwksRsa = require('jwks-rsa'); import jwksClient from 'jwks-rsa'; import * as jsonwebtoken from 'jsonwebtoken'; import { Injectable } from '@nestjs/common'; import { AppLogger } from '../../../logger'; import { DecodeMicroServiceAccessTokenDto } from '../../dto'; import { MicroServiceSub } from '../../enums'; import {MicroServiceGuardModuleConfig} from '../micro-service.guard.module'; @Injectable() export class MicroServiceGuardService { private readonly TAG: string = `${this.constructor.name}`; constructor(private readonly config: MicroServiceGuardModuleConfig) { AppLogger.log('Init', this.TAG); } public getMicroServiceSub(microServiceAllowed: MicroServiceSub): string { return ''; } public async verify(token: string, microServiceAllowed: string): Promise { const client: JwksRsa.JwksClient = jwksClient({ jwksUri: this.config.jwksRoute, }); function getKey(header, callback) { client.getSigningKey(header.kid, (err, key) => { if (err) { AppLogger.error(err, 'MicroServiceGuard'); return callback(null, null); } const signingKey = key['publicKey'] || key['rsaPublicKey']; callback(null, signingKey); }); } return new Promise((resolve, reject) => { jsonwebtoken.verify(token, getKey, {}, (err, decoded: DecodeMicroServiceAccessTokenDto) => { if (err) { AppLogger.error(err, this.TAG); reject(false); return; } else { if (microServiceAllowed === decoded.sub) { resolve(true); return; } AppLogger.log('Failed to authenticate micro service access token'); reject(false); return; } }); }); } }