2019-11-02 NestJS で Firebase Auth を使う
参考
リポジトリ
やったこと
firebase auth に対応した passport-strategy を実装する
npm にそれっぽいやつがいくつかあるけど、どれも ES3 って感じでつらい
必要最低限実装した
nestjs/passport の strategy を実装する
code:src/auth/firebase.strategy.ts
import { Injectable, UnauthorizedException } from "@nestjs/common";
import { PassportStrategy } from "@nestjs/passport";
import admin from "firebase-admin";
import {
FirebaseAuthStrategy,
fromHeaderExtractor
} from "../../lib/passport-firebase-auth";
const projectId = "nestjs-firebase-auth-sandbox";
admin.initializeApp({ projectId });
@Injectable()
export class FirebaseStrategy extends PassportStrategy(FirebaseAuthStrategy) {
public constructor() {
super({
extractor: fromHeaderExtractor
});
}
public async validate(payload: admin.auth.DecodedIdToken) {
if (!payload) {
throw new UnauthorizedException();
}
const user = await admin.auth().getUser(payload.uid);
return user;
}
}
コントローラーでガードの設定を行う
req.user にデータが入っている
user だけ取り出したいならカスタムデコレータを実装すれば良いと思う
code:app.controller.ts
@Get("private")
@UseGuards(AuthGuard("firebase-auth"))
public private(@Request() req: Request) {
console.log(req);
return "Hello!!!";
}
単に実装するだけなら firebase-admin があるので難しくない
今回雑に作った passport-firebase-auth をちゃんと npm に publish できるレベルにするのは大変そう...
あったら便利そうだけど
passport-http-bearer を使うほうがきれいでは
自前で Guard を実装しても良いかも
passport-http-bearer 依存じゃなくなる
ヘッダ解析するのにライブラリはいらない