Cognitoのjwtからユーザ情報を取り出す[python-jose]

Cognitoアイキャッチ

cognitoでサインアップすると返却されるjwtはbase64になっており、decodeするとユーザ情報を取得できます。今回サンプルコードとともにdecodeすると取得できる情報について確認していきます。

目次

サンプルソース

Cognitoに認証してresponseからjwtを取り出してpython-joseでdecodeしています。結果を確認するためにprintでコンソール出力しています。
Lambdaで使用する場合、python-joseは標準ライブラリに入っていないのでデプロイソースに含めるかLambdaレイヤー化を検討してください。

import boto3
from jose import jwt # pip3 python-joseでインストール

client = boto3.client('cognito-idp')
response = client.admin_initiate_auth(
                UserPoolId="ap-northeast-1_XXXXXXX",
                ClientId="xxxxxxxxxxxxxxxxxxxxxxx",
                AuthFlow="ADMIN_NO_SRP_AUTH",
                AuthParameters={
                    'USERNAME': "testuser01",
                    'PASSWORD': "Password_123"
                }
)
# boto3レスポンスからcognito idtoken取り出し
idToken = response['AuthenticationResult']['IdToken']
# python-joseでidtokenをdecode
decoded_payload = jwt.get_unverified_claims(idToken)
# 結果をコンソールに表示
print(decoded_payload)

jwtから取り出せる要素

実行結果は以下のようになります。AWS公式ドキュメントの通りデコードできました。
自分で独自に設定したuser-attributesのnicknameについてもデコードしたjwtに含まれていました。

{"sub": "a5cb8186-00ed-4fca-8d5c-8312d1a50b9d", 
"email_verified": True, 
"iss": "https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_XXXXXXX", 
"phone_number_verified": True, 
"cognito:username": "testuser01", 
"origin_jti": "8069e251-3f43-41d8-9e47-9ae9d7cad089", 
"aud": "5vu97rkrnnp9c5mh975ruat5l1", 
"event_id": "58a12bab-e35d-4909-afe4-ed83dc1215ab", 
"token_use": "id", 
"auth_time": 1671965420, 
"nickname": "田中太郎", 
"phone_number": "+819012345678", 
"exp": 1671969020, 
"iat": 1671965420, 
"jti": "836e4c1e-f352-4e23-a2b6-ff6899c30e1c", 
"email": "testuser01@mail.com"}

注意点 jwtのdecodeはurlsafeで!

base64には通常のものとurlsafeのものがあります。サンプルソースで使用しているpython-joseはurlsafeです。
ざっくり違いを申し上げるとエンコードに使用している文字が少し異なります。以下の記事で詳しく解説しているのでぜひご覧ください。

ランキング

ランキングに参加しています。クリックして応援いただけると嬉しいです。
にほんブログ村 IT技術ブログ クラウドコンピューティングへ
にほんブログ村
AWSランキング
AWSランキング

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次