2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

はじめてのアドベントカレンダーAdvent Calendar 2023

Day 2

Cognito idTokenをAPIGW&Lambdaで受け取ってデコードする

Last updated at Posted at 2023-12-15

Cognito idTokenをAPI GW&Lambdaで受け取ってデコードする手順についてのメモ書きです。

やりたいこと

  1. Cognitoでログインし、idToken(jwt)を払い出す。
  2. 手順1のidTokenを利用し、APIGWで作成された認証必要なAPIを呼び出す。
  3. Cognito Authorizerでユーザー認証を行い、バックエンドのLambdaを起動する。
  4. Lambdaで手順1のidTokenを受け取り、デコードする(emailなどのユーザー情報を取得する)。

image.png

Cognito Userpool

  • Userpoolの作成手順は割愛します。

  • idTokenの払い出しについて、SDKなどを使うことも可能ですが、今回はホストされたUIを使います。(コールバックURLはいったんlocalhostとします)
    image.png

  • あらかじめ登録したユーザーでログインします。
    image.png

  • urlからid_tokenの値をメモっておきます。
    Screenshot 2023-12-14 at 17.14.47.png

Lambda

レイヤー

レイヤーを作っておきます。今回は「python-jose」というpythonのライブラリを使います。
python-joseをダウンロードし、zip化します。

$ pip3 install python-jose -t python
$ zip -r9 layer.zip python

layer.zipをアップロードしてレイヤーを作成します。
image.png

Lambda関数

下記のLambda関数を作成します。

  • ランタイム: Python 3.11
  • アーキテクチャ: x86_64
  • 基本的な Lambda アクセス権限で新しいロールを作成
  • レイヤー: 上記手順で作成したレイヤー
  • ソースコード(eventのheadersからidTokenを取り出し、デコードしユーザーのemailを取得):
    import json
    from jose import jwt
    
    def lambda_handler(event, context):
        token = event["headers"]["Authorization"]
        decoded_token = jwt.get_unverified_claims(token)
        email = decoded_token["email"]
        return {
            "statusCode": 200,
            "body": json.dumps(f"Hello, {email}!")
        }
    

APIGW

オーソライザー

下記のオーソライザーを作成します。

  • オーソライザーのタイプ: Cognito
  • Cognito ユーザープール: 上記手順で作成したCognitoユーザープールを選択
  • トークンのソース: Authorization

API

下記のAPIを作成します。

  • APIタイプ: REST API
  • リソース: /
  • メソッド: GET
    • 統合タイプ: Lambda 関数(上記手順で作成したLambdaを選択)
  • メソッドリクエスト:
    • 認可: 上記手順で作成したCognitoオーソライザーを選択
  • 統合リクエスト:
    • マッピングテンプレート:
      • コンテンツタイプ: application/json
      #set($inputRoot = $input.path('$'))
      {
        "headers": {
          "Authorization": "$input.params().header.get('Authorization')"
        }
      }
      

動作確認

$ curl -H "Authorization: <ログイン時に払い出したidToken>" -X GET <APIエンドポイント>
レスポンス
{"statusCode": 200, "body": "\"Hello, test-user@sample.com!\""}
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?