import { inject } from '@loopback/context'; import { HttpErrors } from '@loopback/rest'; import { TokenService } from './types'; import { TokenServiceBindings } from './keys'; import { UserProfile } from '../data'; const jwt = require('jsonwebtoken'); const jwtSign = jwt.sign, jwtVerify = jwt.verify; export class AppJWTTokenService implements TokenService { constructor( @inject(TokenServiceBindings.SECRET) private _jwtSecret: string, @inject(TokenServiceBindings.ISSUER) private _jwtIssuer: string, @inject(TokenServiceBindings.AUDIENCE) private _jwtAudience: string, @inject(TokenServiceBindings.EXPIRES_IN) private _jwtExpiresIn: string, ) {} async verifyToken (token: string): Promise { try { const userProfile: UserProfile = jwtVerify ( token, this._jwtSecret, { issuer: this._jwtIssuer, audience: this._jwtAudience, } ); return userProfile; } catch (err) { throw new HttpErrors.Unauthorized(`Error: verifying token ${err}`); } } async generateToken (userProfile: UserProfile): Promise { try { const token = jwtSign ( userProfile, this._jwtSecret, { issuer: this._jwtIssuer, audience: this._jwtAudience, expiresIn: Number(this._jwtExpiresIn), } ); return token; } catch (err) { throw new HttpErrors.Unauthorized(`Error: generate token ${err}`); } } }