これで何ができる?
- Cloud Functions for firebase上に構築したAPIを、JWT認証を用いて、(定刻実行の)Github Actionsからのみ叩けるようにする(FunctionsのAPIはFirestoreの操作を行う)。APIへの認証されていないリクエストは全て
401 Unauthorizedまたは403 Forbiddenを返す。
- JWT認証用のミドルウェアを作成し、特定のエンドポイントのみにJWT認証を付与できる。例えば
POST /api/aaaのみJWT認証を必須にしてGET /api/aaaは認証なしにできる。
- Actionsではなく手動でFirestoreを操作したい時は、firebase-adminを用いてローカルから実行できる(ちょっとだけの操作ならfirebase consoleからでも可能)。
Github
ここでは、Githubのコードの要旨のみを抽出。
https://github.com/masa0902dev/jwt-test-with-firebase-and-actions
環境
言語:TS
インフラ:Cloud Functions for firebase, Cloud Firestore (for firebase)
バージョンなど:
arm64 (M2 mac air)
"firebase-tools": "13.29.2"
"firebase": "^11.1.0",
"typescript": "^5.7.3",
"express": "^4.21.2",
"firebase-admin": "^12.6.0",
"firebase-functions": "^6.0.1",
"jsonwebtoken": "^9.0.2",
"node-jose": "^2.2.0"
概要
動作フロー
- Actions
- OIDCトークンを取得(JWTなので<header>.<payload>.<signature>の形式)
- jsファイルにトークンを渡す
- jsファイル内でAuthorizationヘッダにBearerでトークンをつけて、 Functions上のAPIを叩く
- firebase Functions
- Github OIDC用の公開鍵のデータを返すAPIにアクセスして、公開鍵として使用するデータ(複数ある)を取得
- 上記で取得したデータのうち、Actionsからのリクエストのkidと同じkidを持つデータを選択
- そのデータを元にPEM形式の公開鍵を生成
- Actionsからのトークン・上記の公開鍵を用いてJWTを検証
- 検証に成功すれば、JWTのpayloadを取得する
- (ついでに、実行元が指定されたユーザor組織のレポジトリであることを検証)
- API EPの処理を実行
JWS (JWTを使った認証) で設定する値