CustomToken認証を行う際IAMが絡んでくるケースとその対応


この記事について

Firebase/AuthenticationでCustomToken認証を行う場合
Tokenの作成方法は大きく3つありそれぞれの作成方法のメリデメ(感じてることベース)や
Admin SDK にサービス アカウントを検出させる方法を使用する場合IAMの設定が必要になり実際対応した時に出会したエラーや感じたことを記事にさせていただきました。

CustomToken認証を使用するケース

Authenticationではメール/パスワード,SMSと言った頻繁に使われてそうなログイン方法や
Facebbook,Twitterなどのソーシャルログインを簡単に実装することができます。

がしかし、
InstagramのようにAuthenticationのログイン方法に用意されていない場合はどうしましょうか?

答えは、
カスタム認証を使用することです。
Instagram で Firebase ユーザーを認証する


大まかなやりとりはこんな感じなのかな〜と言った具合の図です

CustomTokenを作成する方法

CustomTokenは署名付きのJWT(Json Web Token)です。
CustomTokenの署名に使用される秘密鍵はGoogleServiceAccountに属しており
Firebase Admin SDKがCustomTokenの署名に使用するGoogleServiceAccountは大きく3つの方法で指定することができます。

ServiceAccountJSONファイルを使用する


ServiceAccountJsonファイルはFirebaseConsole>Settings>全般よりダウンロードできます。

const serviceAccount = require('service-account.json')
admin.initializeApp({
    credential: admin.credential.cert(serviceAccount)
})

メリット
・ダウンロードして読み込ませるだけなので設定が楽
デメリット
・管理はしっかり(うっかりするとサービスアカウントに関連する情報がみられる)
・Prod, Stg, Devなど複数環境必要とする場合読み込むJsonファイル指定やらの設定が必要(<-めんどい)

サービス アカウント ID を使用する

admin.initializeApp({
    serviceAccountId: 'your_project_id'
})

メリット
・ProjectIdを指定するだけなので設定が楽
デメリット
・Prod, Stg, Devなど複数環境必要とする場合読み込むJsonファイル指定やらの設定が必要(<-めんどい)

Admin SDK にサービス アカウントを検出させる

Cloud FunctionsなどGoogleが管理する環境にデプロイされている場合
Firebase Admin SDKがローカルのメタデータサーバーよりServiceAccountIdを自動検出しIAMサービスと併用することでリモートでトークンに署名することが可能

admin.initializeApp()

メリット
・Prod, Stg, Devなど複数環境対応が楽(<- 環境が増えるごとにコードを追加する手間からの脱却)
デメリット
・IAMの設定やらのエラーで最初困る(<- この記事を見ればきっと解決w)

Admin SDK にサービス アカウントを検出させる時のエラー対応

Error: Identity and Access Management (IAM) API has not been used in project {projectId} before or it is disabled...(省略)

Enable it by visiting {url}

IAM APIを有効にする必要があります。

Errorの中にこのurlにアクセスしてIAM APIの設定をみてくださいな文が含まれてるので
IAM APIの設定を有効にしましょう

Error: Permission iam.serviceAccounts.signBlob is required to perform this operation on service account projects/-/serviceAccounts/{project_name}@appspot.gserviceaccount.com

IAM APIを有効にしただけではまだ終わりません。
{project_name}@appspot.gserviceaccount.comサービス アカウント トークン作成者の役割を付与する必要があります。

こちらはGCPConsoleで役割を付与してください