Cognitoのユーザ情報をLambdaで取得

  • 2020.05.14
  • AWS
Cognitoのユーザ情報をLambdaで取得

要約

基本、認証に使用する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に含めたくない場合

  1. 「JWTに情報を含めないようにする」
    マネジメントコンソール > Cognito > ユーザプール > アプリクライアント> 詳細を表示 > 属性の読み込みおよび書き込みアクセスを設定する から読み取り可能な属性のチェックを外す。→忘れず変更を保存する。

    これで、JWTにcognito:testが含まれなくなる。
  2. 「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() // ユーザ情報取得

// ・・・