All files / src/security AccessTokenSecurity.ts

100% Statements 23/23
85.71% Branches 12/14
100% Functions 8/8
100% Lines 23/23

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 438x   8x     8x   2x 2x 2x 2x 1x   1x           3x 3x 3x 1x   2x         3x 3x 3x 3x 3x 1x 1x 1x     3x      
import jwt from 'jsonwebtoken'
import { NextFunction, Request, Response } from 'express'
import { UserModule } from '../UserModule'
import RequestAuth = Express.RequestAuth
 
export const AccessTokenSecurity = {
  sign: (payload: RequestAuth): Promise<string> => {
    const signOptions = UserModule.getOptions().accessToken || {}
    return new Promise(((resolve, reject) => {
      jwt.sign(payload, UserModule.accessTokenKeys.privateKey, signOptions, (err, token) => {
        if (err) {
          return reject(err)
        }
        resolve(token)
      })
    }))
  },
 
  verify: (token: string): Promise<RequestAuth> => {
    return new Promise((resolve, reject) => {
      jwt.verify(token, UserModule.accessTokenKeys.publicKey, (err, data) => {
        if (err) {
          return reject(err)
        }
        resolve(data as RequestAuth)
      })
    })
  },
 
  setRequestAuthMiddleware: async (req: Request, res: Response, next: NextFunction) => {
    const { headers } = req
    const authHeader = headers.Authorization || headers.authorization
    const bearerToken = Array.isArray(authHeader) ? authHeader[0] : authHeader
    if (bearerToken && bearerToken.split(' ')[0] === 'Bearer') {
      const token = bearerToken.split(' ')[1]
      try {
        req.auth = await AccessTokenSecurity.verify(token)
      } catch (e) {}
    }
    next()
  },
}