All files / src/web/middleware googleOAuth2Middleware.ts

100% Statements 34/34
92.3% Branches 12/13
100% Functions 2/2
100% Lines 34/34

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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67  7x 7x 7x 7x     7x 5x   5x 1x   1x     4x 1x   1x     3x 1x   1x     2x   2x 2x   2x   1x   1x   1x       7x 10x   10x 1x   1x     9x   9x   9x   9x   9x       7x 7x  
import { Request, Response, NextFunction } from "express";
import { DependencyInjector } from "../../dependencyInjector";
import { injectables } from "../../core/types/injectables";
import GoogleOAuth2IdentifiersFactory from "../../googleOAuth2/factories/googleOAuth2IdentifiersFactory";
import { ResponseExtensions } from "../../core/extensions/responseExtensions";
import GoogleOAuth2ClientProvider from "../../googleOAuth2/providers/googleOAuth2ClientProvider";
 
const redirect = async (req: Request, res: Response) => {
    const { client_id, client_secret, redirect_uri, code } = req.body;
    
    if(client_id === undefined || client_secret === undefined || redirect_uri === undefined) {
        ResponseExtensions.unauthorized(res, "No credentials provided");
 
        return;
    }
 
    if (client_id !== process.env.GOOGLE_OAUTH2_CLIENT_ID || client_secret !== process.env.GOOGLE_OAUTH2_CLIENT_SECRET) {
        ResponseExtensions.unauthorized(res, "Mismatched credentials");
        
        return;
    }
 
    if(code === undefined) {
        ResponseExtensions.forbidden(res, "No authorization code provided");
        
        return;
    }
    
    const identifiers = GoogleOAuth2IdentifiersFactory.create({ redirectUri: String(redirect_uri) });
  
    try {
        const googleOAuth2ClientProvider = await DependencyInjector.Singleton.generateGmailServiceAsync<GoogleOAuth2ClientProvider>(injectables.GoogleOAuth2ClientProviderGenerator, identifiers);
 
        const tokens = await googleOAuth2ClientProvider.tryAuthorizeAsync(String(code));
 
        ResponseExtensions.ok(res, tokens);
    } catch(ex) {
        const error = ex as Error;
 
        ResponseExtensions.internalError(res, error.message ?? ex);
    }
};
 
const protect = async (req: Request, res: Response, next: NextFunction) => {
    const authHeader = req.get('Authorization');
 
    if (authHeader === undefined) {
        ResponseExtensions.unauthorized(res, "No access token provided");
        
        return;
    }
    
    const accessToken = authHeader.replace('Bearer ', '');
 
    const refreshToken = req.get('X-Refresh-Token');
 
    const identifiers = GoogleOAuth2IdentifiersFactory.create({ accessToken, refreshToken });
 
    res.locals.googleOAuth2Identifiers = identifiers;
 
    return next();
};
 
export {
    redirect,
    protect,
}