Kong Gatewayのプラグインを活用してLambdaのルートにCognitoでOIDC認証を導入してみる

Kong Gatewayのプラグインを活用してLambdaのルートにCognitoでOIDC認証を導入してみる

Clock Icon2024.12.19

APIの管理を効率化したい えがわ です。

本記事は「Kong Advent Calendar 2024」の19日目のエントリとして、Kong GatewayのLambdaのルートにCognitoのOpenID Connect(以下OIDC)認証を導入します。

前回の記事でKong Gatewayのプラグインを使用してLambdaを実行してみました。
今回は前回作成したルートにCognitoを使用したOIDC認証を導入してみます。

環境

  • kong Konnect
  • Kong Gateway 3.8
  • EC2: Amazon Linux 2023
  • Lambda: Python 3.13
  • Cognito

やってみる

Kong GatewayからLambdaを実行するところまでは以下のブログをご確認ください。
https://dev.classmethod.jp/articles/kong-konnect-ec2-lambda/

認証の都合上、本記事ではKong Gatewayを起動しているEC2で動作確認を行います。

現状の確認

現状のルートを確認しておきます。

[ec2-user@ip-10-0-11-92 ~]$ curl http://localhost:8000/lambda

{"statusCode":200,"body":"\"Hello from Lambda!\""}

このルートに認証を追加します。

Cognitoの設定

Amazon Cognitoに遷移しユーザープールとアプリケーションを作成します。
kong_lambda_cognito_oidc_01.png

kong_lambda_cognito_oidc_02.png

ユーザープールとアプリケーションクライアントが作成されました。

kong_lambda_cognito_oidc_03.png

アプリケーションクライアントを設定していきます。

ログインページを編集します。

kong_lambda_cognito_oidc_04.png

許可されているコールバック URLに以下を設定します。

kong_lambda_cognito_oidc_13.png

OpenID Connect のスコープにaws.cognito.signin.user.adminプロファイルを選択します。

kong_lambda_cognito_oidc_05.png

Cognitoの設定は完了ですが、確認する項目があるので、ページは閉じないようにしてください。

Kongプラグインの設定

LambdaのルートでOIDCプラグインを有効にします。

kong_lambda_cognito_oidc_06.png

OpenID Connectプラグインを選択します。

kong_lambda_cognito_oidc_07.png

項目
Client Id CognitoクライアントアプリケーションのID
Client Secret Cognitoクライアントアプリケーションのシークレット
Issuer ※OIDC検出エンドポイント

※CognitoのOIDC検出エンドポイントは以下を置き換えてください。

OIDC検出エンドポイント
https://cognito-idp.{リージョン}.amazonaws.com/{ユーザープールID}/.well-known/openid-configuration

kong_lambda_cognito_oidc_08.png

OIDCプラグインの設定はこちらで完了です。

動作確認

リクエストを送ってみます。

curl -i http://localhost:8000/lambda

HTTP/1.1 302 Moved Temporarily
Date: Wed, 18 Dec 2024 07:00:08 GMT
Connection: keep-alive
Cache-Control: no-store
Set-Cookie: authorization=AQAAND2mD... Path=/; SameSite=Default; HttpOnly
Location: https://us-east-1...auth.us-east-1.amazoncognito.com/oauth2/authorize?redirect_uri=...&response_type=code&scope=openid&state=...&response_mode=query&client_id=...&nonce=...
Content-Length: 0
X-Kong-Response-Latency: 2
Server: kong/3.8.0.0-enterprise-edition
X-Kong-Request-Id: 7929a8009047603e12cc9c41256e520d

ルートにOIDCの認証が追加されています。

LocationのURLにブラウザでアクセスします。

kong_lambda_cognito_oidc_09.png
kong_lambda_cognito_oidc_10.png

アカウントを作成しリダイレクトするとクエリパラメータに認証コードが付与されています。

kong_lambda_cognito_oidc_11.png

こちらを使用してアクセストークンを取得します。

COGNITO_DOMAIN={※Cognitoのドメイン}
CLIENT_ID={クライアントID}
CLIENT_SECRET={クライアントシークレット}
REDIRECT_URI=http://localhost:8000/lambda
AUTH_CODE={上記で取得した認証コード}

curl -X POST \
  "${COGNITO_DOMAIN}/oauth2/token" \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -u "${CLIENT_ID}:${CLIENT_SECRET}" \
  -d "grant_type=authorization_code" \
  -d "client_id=${CLIENT_ID}" \
  -d "code=${AUTH_CODE}" \
  -d "redirect_uri=${REDIRECT_URI}"

{"id_token":"{IDトークン}","access_token":"{アクセストークン}","refresh_token":"{リフレッシュトークン}","expires_in":3600,"token_type":"Bearer"}

※Cognitoのドメインはマネジメントコンソールから確認することが可能です。

kong_lambda_cognito_oidc_12.png

アクセストークンを取得できたので、リクエストを行います。

ACCESS_TOKEN={アクセストークン}

[ec2-user@ip-10-0-11-92 ~]$ curl -H "Authorization: Bearer ${ACCESS_TOKEN}" \
  http://localhost:8000/lambda
{"body":"\"Hello from Lambda!\"","statusCode":200}

リクエストを実行できました。

さいごに

Kongのプラグインを使用することで、アプリケーションに変更を加えずOIDC認証を導入することができました。
認証のプラグインに関してはOIDCだけでなくJWTLDAPも選択することが可能です。
この記事がどなたかの参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.