CloudRunに「認証が必要」を設定したら開発環境から呼べなくなったのは、”開発用の汎用 ID トークン”が必要だったからなのだ。

blogのヘッダー。認証っぽいつながり的な画像。

CloudRunの認証にはIDトークンが必要、ってのはわかるが……。

 ちなみに話に関係するかもしれない当方の環境。

・win10
・Flutter
・CloudRun

 protocol bufferをつかってgRPCでCloudRunにデプロイしたサーバーとやり取りしたいなぁと。
ローカルでは諸々うまく起動して、さらに認証なしで呼べる設定の段階では、特に問題なくAndroidStudio上のエミュレーターから呼べてたわけですが、これがCloudRunの方を認証アリにすると、途端に”token_invailed”が返ってきて繋がらなくなったわけです。

 FirebaseのAuthやらGoogleAuthやら、各種プリンシパルに権限付与やら色々ためして、公式ドキュメントもあちこち探し回ってはや3日。ようやくたどり着いたのが以下のページの該当セクション。

ID トークンを取得する  |  Authentication  |  Google Cloud

開発用のトークンが必要だったのね……。

 起動用の権限が必要なプリンシパルに付与されてる前提で、さらに開発用の汎用IDトークンなるものが必要だった模様。

 用意するのは「gcloud CLI」が使える状態ならカンタン!
コマンドプロンプトだとかPowerShellだかなんだか、とにかくgcloud呼べる所で以下の呪文を唱える。

gcloud auth print-identity-token

 すると、あらららのら~って感じで開発用のIDトークンが出てくるので、よしなに利用すればよし。
クライアント側のリクエストに、

'Authorization': 'Bearer ${開発用IDトークン}',

ってな感じでぶっ込んであげたら、無事、認証アリのCloudRunさんがサーバーまで通してくれました!

(ご注意)ドキュメントにもあるけど、このトークンは開発時にのみ使用すること。決して本番環境に含めちゃいけません。ダメ、ゼッタイ。お兄さんとの約束だぞ。

グーグルさんよ、あんた、友達少ないだろ?

 GCPのドキュメントに出てくる「トークン」にはどうやら色々種類があるらしく。……いやね、同じサービスなら大体どれも一緒だろとタカを括ってたこっちも悪いんですけども。それにしたって分かりにくすぎるんすよねー。FirebaseにあるGoogle認証のトークンだけで事が足りると、思いたいじゃないっすか、人情としては、ねぇ。

 まあ、こう試行錯誤して乗り越える快感みたいのはあるんだけどもさ、こういう情報はもっとスッと見つかるようにドキュメント整備して欲しい……。まじで、俺はお前のお母さんじゃないんだぞッ、とな。わかるように頼みますよ~。

 なにはともあれ、開発環境で通るようになった以上、本番環境でも似たような手順で認証できるはずなので、散々遠回りはしたけどその点は少しお気楽になれますな。よしよし、である。

追記(普通にgoogle認証でも呼べました…)

 結局その後、コード振り返ってみて「google_sign_in」のパッケージでトークン呼んだら、普通に認証パスしてくれました笑
 この数日の苦労はなんだったんやぁ……。

 てなわけで、まあ、ザックリ以下のようなコードとCloudRun起動元が権限としてセットされてればおそらく開発環境だろうとなんだろうと呼び出せるんだと思います。(userがgoogle認証で登録されてると仮定)

import 'package:google_sign_in/google_sign_in.dart';

(中略)
 
final GoogleSignInAccount? user = await GoogleSignIn().signIn();
 final GoogleSignInAuthentication? auth = await user?.authentication;
 final token = auth?.idToken;

 (常識だろうけど、async内で呼び出してね。)
 そんで、このtokenをヘッダ(grpcならmetadata以下のAuthorization)にぶっ込んであげてくださいませね。

コメント

タイトルとURLをコピーしました