🗝️

Identity-Aware Proxy で外部 ID を許可し、Cloud Run でログインページをホスティングする

2023/12/17に公開

2023年は「Cloud Run を触って覚える」をテーマとした ひとりアドベントカレンダー を開催しており、Cloud Run のさまざまな機能や Cloud Run でよく使う構成などをご紹介しています。

17日目は Identity-Aware Proxy (IAP) 用の Identity Platform のログイン画面を Cloud Run でホスティングする機能についてご紹介します。

Cloud Run の概要は「gihyo.jp」で解説していますので、こちらもぜひご覧ください。

https://gihyo.jp/article/2023/10/modern-app-development-on-google-cloud-03

Identity Platform を使って Identity-Aware Proxy で外部 ID を許可する

Identity-Aware Proxy (以下 IAP) はアプリケーションの手前にアクセス認証をプロキシすることができるサービスです。Cloud Run ではロードバランサと組み合わせて使うことで、Cloud Run のアプリケーションの中でログインページや認証処理を実装する手間を省くことができます。

次の記事では、IAP と Cloud Run を組み合わせる基本的な方法について解説しました。

https://zenn.dev/google_cloud_jp/articles/cloudrun-iap

この記事で紹介した内容では、IAP でのアクセスを許可するには Google アカウントに対して IAM ロールを付与する必要があります。

IAP には Identity Platform を使って外部 ID からのアクセスを許可することができます。この構成を取る場合、IAP から Identity Platform のログインページにリダイレクトされ、ログインが完了したら IAP に戻ってくる形になります。

Identity Platform はログインページをホスティングする機能を持っていませんが、Cloud Run を使ってワンクリックでログインページをデプロイする機能があります。

Identity Platform を使って IAP で外部 ID を許可する
Identity Platform を使って IAP で外部 ID を許可する

この記事では次のドキュメントの流れに沿って、その手順を解説します。

https://cloud.google.com/iap/docs/cloud-run-sign-in?hl=ja

Identity Platform を作成する

まずは Identity Platform を準備します。今回はメールアドレスとパスワードでログインできるように設定します。

Identity Platform のコンソールを開きます。

https://console.cloud.google.com/customer-identity

Identity Platform の API を有効化します。

API の有効化
API の有効化

ID プロバイダを追加します。Twitter (X) や Facebook など、ログインさせたい ID プロバイダを必要な分だけ増やしていく形になります。[プロバイダを追加] をクリックします。

ID プロバイダの追加
ID プロバイダの追加

プロバイダの設定を行います。[プロバイダの選択] は [メール / パスワード] を選択します。

プロバイダの選択
プロバイダの選択

[作成] をクリックすると、メール方式のプロバイダが [有効] の状態で ID プロバイダ一覧に追加されます。

プロバイダの追加
プロバイダの追加

以上で Identity Platform の準備は終わりです。簡単ですね!

IAP で外部 ID を許可する

次に IAP に外部 ID を許可する設定を行います。Cloud Run と IAP の設定は、次の記事の手順で作成したものを使います。この記事では割愛しますので、自分の環境で試す場合は次の記事を参照して用意してから進めてください。

https://zenn.dev/google_cloud_jp/articles/cloudrun-iap

まず IAP のコンソールを開きます。

https://console.cloud.google.com/security/iap

設定する対象のバックエンド サービスを選択し、右ペインに表示される [承認に外部 ID を使用します] の [開始] をクリックします。

外部 ID の使用
外部 ID の使用

ID システムの変更についての注意事項が表示されます。OAuth リダイレクト先へのドメイン登録が自動で登録されるため、設定の手間が省かれています。また IAM による設定から完全に切り替わるため、IAM で [IAP-secured Web App User] ロールに追加していたユーザーはログインできなくなります。確認した上で [変更] をクリックします。

ID システムの変更
ID システムの変更

続いて、外部 ID に使用する Identity Platform の設定を行います。

IAP から遷移するログインページを設定する必要があります。未ログイン状態でアクセスした場合、まずはここで設定したログインページにリダイレクトするような動きになります。

ログインページは Cloud Run で作成するか、独自に用意するか、いずれかから選択できます。[ログインページを作成] を選び、[リージョン] は asia-northeast1 (東京) を選択します。

ログインページの作成
ログインページの作成

次に Identity Platform のどの ID プロバイダを使用するか設定します。[Email / Password] のプロバイダを選択し、[保存] をクリックします。複数選択することもできるので、例えば「Twitter (X) と Google のログインだけ許可する」などといった設定も可能です。

ID プロバイダの設定
ID プロバイダの設定

設定が完了すると、[ログインページを作成] を選んだ場合はログインページをホスティングする Cloud Run サービスの作成が行われます。デプロイには数分かかります。

Cloud Run サービスのデプロイ中
Cloud Run サービスのデプロイ中

デプロイが完了したら、作成された Cloud Run サービスのリソース情報が表示されます。カスタムドメイン経由でアクセスするため、ここでアクセスする必要はありません。

Cloud Run サービスのデプロイの完了
Cloud Run サービスのデプロイの完了

以上で設定は完了です。

動作を確認する

動作を確認してみましょう。IAP を設定している外部 HTTPS ロードバランサのカスタムドメインにアクセスすると、Google のログインページではなく独自のログインページに遷移するように変わっていることが確認できます。

ログインページ
ログインページ

メールアドレスを入力し次に進むと、ユーザーが未登録の場合はユーザー登録画面に変わります。名前とパスワードも入力し、次に進みます。

ユーザーの新規登録
ユーザーの新規登録

登録が完了するとログインに成功し、アプリにリダイレクトされることが確認できます。X-Goog-IAP-JWT-Assertion に設定された JWT も Identity Platform 経由でログインしたユーザーのものになっています。jwt.io などで確認してみてください。

ログインの成功
ログインの成功

新規ユーザー登録できないようにする

Identity Platform ではユーザー自身が新規登録できる設定がデフォルトで有効化されていますが、無効にすることもできます。管理者側からしかユーザー登録できないようなサービスを提供したい場合に有効です。

Identity Platform の設定を変更する場合は [設定] メニューを開きます。

https://console.cloud.google.com/customer-identity/settings

[ユーザーアクション] の [作成を可能にする (登録する)] のチェックを外し [保存] をクリックします。

設定の変更
設定の変更

ログインページで新規登録しようとすると、エラーが表示されるようになります。

新規登録の拒否
新規登録の拒否

まとめ

IAP 単体では IAM による許可になるため、組織や社内のみにサービスを公開したい場合に適しています。外部 ID を使うとソーシャルアカウントも含めさまざまな ID プロバイダ経由のログインも許可することができるため、ログインが必要な一般公開用のサービスなどにも使えるようになります。

Cloud Run でホスティングしたログインページは ある程度のカスタマイズ しかできませんが、細かい振る舞いも含めフルカスタマイズしたい場合は 自分で実装したログインページ を設定することもできます。まずは Cloud Run でホスティングしたログインページを使い始め、よりカスタマイズ範囲を増やしたくなったらカスタム ログインページに移行するといった進め方がおすすめです。

Google Cloud Japan

Discussion