- toCアプリの認証認可ソリューションを選定する場合、OpenID ConnectやOAuth2.0等の技術を利用したソーシャルログインの実装が候補に上がることが多いのではないでしょうか。
- 今回はAmazon API GatewayのJWTオーソライザーを利用して、Googleアカウントで認証済み利用者への認可処理を実装してみました。
環境構成
設定手順
Google OAuth 2.0をセットアップする
※事前にGoogle Cloud Platformでプロジェクト作成が完了していることを想定しています。
-
Google Cloud Platformの「APIとサービス」にアクセスします。
-
「OAuthクライアントIDの作成」を選択し、必要な情報を入力します。
- アプリケーションの種類:ウェブアプリケーション
- 名前:任意の名前を入力
- 承認済みのリダイレクトURI:http://127.0.0.1/callback
-
クライアント作成後に表示される、クライアントIDとシークレットを控えておきます。
Lambdaを作成する
- AWSコンソールにログイン後、Lambdaコンソールへ遷移します。
- 「関数の作成」を押下し、ランタイムに「Python 3.11」を選択して、Lambda関数を作成します。(ソースコードは変更不要です。)
API Gatewayを作成する
-
AWSコンソールにログイン後、API Gatewayコンソールへ遷移します。
-
先程作成したLambdaとの統合を設定します。
-
作成完了後、https://[APIのURL]/[Lambda関数名]をWebブラウザで開き、API Gateway経由でLambda関数を呼び出せることを確認します。
API GatewayにJWTオーソライザーを設定する
- 作成したAPI Gatewayの設定画面にて、「Authorization」メニューを選択します。
- 「オーソライザーを作成してアタッチ」を押下します。
- オーソライザーを作成します。
- タイプ:JWT
- 発行者URL:https://accounts.google.com
- OpenID Configurationエンドポイントから情報取得可能です。
- 対象者:手順「Google OAuth 2.0をセットアップする」で取得したクライアントIDを指定してください。
動作確認手順
異常系
正常系
OIDCの認可コードフローでIDトークンを取得した上で、API Gatewayにアクセスできることを確認します。
-
認証リクエスト
- Webブラウザで認可エンドポイントにアクセスし、遷移後の画面でご自身のGoogleアカウントでログインします。
- response_type
- レスポンスとして認可コードを取得するために、
code
を指定します。
- レスポンスとして認可コードを取得するために、
- state
- CSRF対策のために、ランダムな値を指定します。
- scope
- トークンエンドポイントからアクセストークンだけでなくIDトークンも取得するために、
oidc
を指定します。
- トークンエンドポイントからアクセストークンだけでなくIDトークンも取得するために、
- redirect_uri
- 認証レスポンス時のリダレクト先として、
http://127.0.0.1/callback
を指定します。(今回はローカルループバックアドレスを指定していますが、実際にアプリケーションを作成する場合は適切なURLを指定してください。)
- 認証レスポンス時のリダレクト先として、
https://accounts.google.com/o/oauth2/v2/auth ?response_type=code &client_id=[クライアントID] &state=xyz &scope=openid &redirect_uri=http://127.0.0.1/callback
- response_type
- Webブラウザで認可エンドポイントにアクセスし、遷移後の画面でご自身のGoogleアカウントでログインします。
-
認証レスポンス
-
http://127.0.0.1/callback
にリダイレクトされるので、URLバーに表示される認可コード(クエリ文字列code
)の値を控えておきます。
-
-
トークンリクエスト
-
CurlでトークンエンドポイントにHTTPリクエストし、レスポンスに含まれる
id_token
の値を控えておきます。curl \ -d "client_id=[クライアントID]" \ -d "client_secret=[クライアントシークレット]" \ -d "redirect_uri=http://127.0.0.1/callback" \ -d "grant_type=authorization_code" \ -d "code=[認可コード]" \ https://www.googleapis.com/oauth2/v4/token
-
-
IDトークンを用いたAPI Gatewayへのアクセス
- Curlで
id_token
の値を用いてAPI GatewayにHTTPリクエストし、「Hello from Lambda!」と表示されれば成功です!curl \ -H 'Authorization: Bearer [IDトークン]' \ https://[API GatewayのURL]/[Lambda関数名]
- Curlで
まとめ
-
API GatewayのJWTオーソライザーを利用して、Googleログインユーザへの認可処理を実装してみました。
-
今回はJWTの検証及び認可までを実装しましたが、Lambda関数でクレーム情報にアクセスすることもできますので、ぜひお試しください〜
参考
- OAuth 2.0 を使用した Google API へのアクセス
- JWT オーソライザーを使用した HTTP API へのアクセスの制御
注意事項
- 本記事は万全を期して作成していますが、お気づきの点がありましたら、ご連絡よろしくお願いします。
- なお、本記事の内容を利用した結果及び影響について、筆者は一切の責任を負いませんので、予めご了承ください。