【Firebase】Firebase Authのカスタムトークン認証でGCPコンソール操作が必要になったメモ
背景
LIFFアプリを作っていてFirebase Authのカスタムトークン認証(LINEログイン)を実装する過程エラーが発生しました。
解決するためにGCPのコンソール操作が必要になったので忘れないようにメモします。
「IAM Service Account Credentials API」や「iam.serviceAccounts.signBlob」関係のエラーで困られている方がいましたら参考になるかもしれません。
IAM APIを有効にする
LINEログインの実装の過程で以下のエラーが発生しました。
「IAM Service Account Credentials APIを有効にしていないかもよ」とエラーメッセージが表示されています。
Unhandled error FirebaseAuthError: IAM Service Account Credentials API has not been used in project {YOUR_PROJECT_ID} before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/iamcredentials.googleapis.com/overview?project={YOUR_PROJECT_ID} then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.; Please refer to https://firebase.google.com/docs/auth/admin/create-custom-tokens for more details on how to use and troubleshoot this feature.
エラーメッセージにはIAM Service Account Credentials API(有効なAPIとサービス)までのリンクが貼ってあるのでリンクを押下し該当ページへ遷移します。
手動でGCPの「有効なAPIとサービス」ページへ移動する場合は、GCPコンソールのトップ画面 > 左上のナビゲーションメニューを押下 > 「APIとサービス」を選択 > 「有効なAPIとサービス」を選択で遷移できます。
説明に戻ります。遷移後は下記のようなページになっていると思うので、APIを有効にします。有効になっているのを確認したらページは閉じてしまって問題ありません。
■有効にするボタンを押下する
■ステータスが有効になっていることを確認する
「サービスアカウントトークン作成者」ロールを付与する
IAM Service Account Credentials APIを有効にして一件落着と思いきや、次に下記のエラーが発生しました。
Unhandled error FirebaseAuthError: Permission 'iam.serviceAccounts.signBlob' denied on resource (or it may not exist).; Please refer to https://firebase.google.com/docs/auth/admin/create-custom-tokens for more details on how to use and troubleshoot this feature.
前回と同様にエラーメッセージに貼ってあるリンクを押下し詳細を確認しにいきます。(下記リンクを押下でもOK)
どうやらFirebase Admin SDK が実行されているサービス アカウントにiam.serviceAccounts.signBlob権限がないためにエラーが発生しているようです。
さらに記事を読み進めていくと解決方法まで記載されています。
これを解決する最も簡単な方法は、問題のサービス アカウント (通常は{project-name}@appspot.gserviceaccount.com ) に「サービス アカウント トークン作成者」IAM ロールを付与することです。
解決方法がわかったので実際にGCPコンソールからサービスアカウントに「サービスアカウントトークン作成者」ロールを付与する操作をしていきます。
上記を押下しGCPに登録しているプロジェクトを選択すると下記の「IAMと管理」ページに遷移できます。
もし手動でGCPの「IAMと管理」ページへ移動する場合は、GCPコンソールのトップ画面 → 左上のナビゲーションメニューを押下 → 「IAMと管理」を選択 → 「サービスアカウント」を選択 → 「firebase-adminsdk」を選択 → 権限タブを選択してください。
公式の解決方法にも記載があったように赤枠のアカウント({project-name}@appspot.gserviceaccount.com)に「サービスアカウントトークン作成者」ロールを付与していきましょう。
■編集アイコンを押下する
■「別のロールを追加」を押下する
■「サービスアカウントトークン作成者」を選択し保存ボタンを押下する
■「サービスアカウントトークン作成者」が反映されていることを確認する
長くなりましたが、以上の操作でLINEログイン(Firebase Authを使ったカスタムトークン認証)を正常に行うことができるようになりました。
今回の実装を振り返る
複数記事で「Cloud Functions サービス エージェント」に「サービスアカウントトークン作成者」ロールを付与すると解決できる。と書かれているものもありましたが自分のプロジェクトではエラーを解決することはできなかったです。
2019〜2020年頃の記事だったので、もしかしたらプロジェクトの設定が違う。またはGCPが更新されたことが要因で記事の情報が古くなってしまっている可能性もあります。
※少し脱線しますが、例えば「Cloud Functions サービス エージェント」を削除するとCloud Functionsで新規に作った関数がデプロイ不可になります。
「Cloud Functions サービス エージェント」以外のアカウントも作成した覚えはないのでFirebaseのプロジェクトを作成するとデフォルトで「サービスアカウント」がアタッチされるのでしょう。便利ですね。
「Cloud Functions サービス エージェント」を削除(変更)したらどうなるのかについては公式で明言されていました。
デフォルトでは、Google Cloud Functions サービス エージェント サービス アカウント(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com)にはプロジェクトの cloudfunctions.serviceAgent ロールが付与されています。このアカウントの権限を変更すると、関数の作成、更新、削除が失敗することがあります。
また、今回のキーワードになっている「サービスアカウントとはなにか?」については公式で以下のように説明されています。
サービス アカウントは、ユーザーではなく、Compute Engine 仮想マシン(VM)インスタンスなどのアプリケーションやコンピューティング ワークロードで使用される特別なアカウントです。サービス アカウントは、アカウント固有のメールアドレスで識別されます。
こちらに関してはいまだに腹落ちしていないのでもう少し調査が必要そうです。
また、上記の記事を読み進めていくと今回コンソールで操作した「サービス アカウント トークン作成者のロール」の項目があり詳細ページへのリンクが貼ってあります。
気になって詳細ページを覗いてみると、なんと今回の一連の流れがしっかりと説明されていました!
はあー、灯台下暗し。
最後に
GCPのコンソール操作でFirebase Authを使ったカスタムトークン認証(LINEログイン)で発生しているエラーを解決することができました。
コンソール操作が必要になるケースとして今回のカスタムトークン認証やGCSへの認証付きURL発行の時に必要になるようです。GCSへの認証付きURL発行では別途「Identity and Access Management (IAM) API」を有効する必要があるようですね。
今回はFirebaseを使ったOAuth 2.0(LINEログイン)でしたが、Firebaseを使わない(自分でサービスアカウントを作成する)OIDCの解説記事もあったので載せておきます。
この記事がどなたかの参考になりましたら幸いです。
最後までご覧いただきありがとうございました。
補足(2023年8月15日)
今回筆者はGCPコンソールにフォーカスした記事を書いたが以降のLINEログインに関する実装は下記にて詳細が述べられていたので添付する。
Discussion