Cognitoのユーザ情報をLambdaで取得
- 2020.05.14
- AWS
要約
基本、認証に使用するIDトークン(JWT)にユーザ情報が含まれているので、それをbase64デコードしてやればOK。
ただし、クライアントに見せたくない(=JWTに含めたくない)属性の場合は、少し工夫が必要という話。
内容
JWTから取得する場合
以下、LambdaをNode.jsで書いた場合の参考
const token = event.headers["Authorization"];
const userInfo = token.split('.')[1];
// 以下、userInfoをbase64でデコード
以下のパラメータが得られる。(値は全て書き替えてます。)custom:testというのは、手動で追加したカスタム属性。
{
"sub": "sub",
"aud": "aud",
"email_verified": true,
"event_id": "event_id",
"token_use": "token_use",
"auth_time": "auth_time",
"custom:test": "test",
"iss": "iss",
"cognito:username": "username",
"exp": "exp,
"iat": "iat",
"email": "email"
}
JWTに含めたくない場合
- 「JWTに情報を含めないようにする」
マネジメントコンソール > Cognito > ユーザプール > アプリクライアント> 詳細を表示 > 属性の読み込みおよび書き込みアクセスを設定する から読み取り可能な属性のチェックを外す。→忘れず変更を保存する。
これで、JWTにcognito:testが含まれなくなる。 - 「LambdaからCognitoの情報を取得する」
まずは、Cognitoのユーザ情報を取得するロールをLambdaに付与する。
(以下、serverless.ymlの設定)
iamRoleStatements:
- Action:
- cognito-idp:AdminGetUser
Resource: {ユーザプールのARN}
Effect: Allow
Lambda側の実装は以下。
const AWS = require('aws-sdk');
module.exports.hello = async event => {
const cognito = new AWS.CognitoIdentityServiceProvider();
var params = {
UserPoolId: 'プールID',
Username: 'ユーザ名'
};
const user = await cognito.adminGetUser(params).promise() // ユーザ情報取得
// ・・・
-
前の記事
Material-UI Pickersで日本語化・フォーマット変更する 2020.03.20
-
次の記事
ServerlessFrameworkで環境変数を使う 2020.05.17