From b81e571901adde67ce09a170851253c14fe19c38 Mon Sep 17 00:00:00 2001 From: garrettmills Date: Fri, 9 Apr 2021 21:59:06 -0500 Subject: [PATCH] Add firebase user auth middleware --- .../api/FirebaseUserOnly.middleware.ts | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/app/http/middlewares/api/FirebaseUserOnly.middleware.ts diff --git a/src/app/http/middlewares/api/FirebaseUserOnly.middleware.ts b/src/app/http/middlewares/api/FirebaseUserOnly.middleware.ts new file mode 100644 index 0000000..4b08885 --- /dev/null +++ b/src/app/http/middlewares/api/FirebaseUserOnly.middleware.ts @@ -0,0 +1,42 @@ +import {Config, error, Middleware} from "@extollo/lib" +import {Inject, Injectable} from "@extollo/di" +import {FirebaseUnit} from "../../../units/FirebaseUnit" +import {HTTPStatus} from "@extollo/util" + +/** + * FirebaseUserOnly Middleware + * -------------------------------------------- + * Authenticates the request based on the user ID token. + */ +@Injectable() +export class FirebaseUserOnly extends Middleware { + @Inject() + protected readonly firebase!: FirebaseUnit + + @Inject() + protected readonly config!: Config + + get headerName(): string { + return String(this.config.get('app.firebase.api_auth_header')) + } + + getAuthHeader(): string { + const tokens = this.request.getHeader(this.headerName) + if ( Array.isArray(tokens) ) return tokens[0] + return String(tokens) + } + + public async apply() { + const token = this.getAuthHeader() + + if ( !token ) { + return error(`Missing ${this.headerName} header`, HTTPStatus.UNAUTHORIZED, 'json') + } + + try { + await this.firebase.get().auth().verifyIdToken(token) + } catch (e) { + return error('Invalid API token.', HTTPStatus.UNAUTHORIZED, 'json') + } + } +}