8.1. Build Lambda pre-generation tokens trigger

Build Lambda Trigger

We will build a Lambda trigger for both TypeScript and Python. This trigger will update claims using the claimsAndScopeOverrideDetails property in event.response. Specifically:

  • idTokenGeneration.claimsToAddOrOverride: update ID Token claims
  • accessTokenGeneration.claimsToAddOrOverride: update Access Token claims

TypeScript

  1. In your local project, go to src/runtimes/lambda-functions.
  2. Create a folder authorizer and inside it, create pre-token-generation-trigger.ts.
  3. Add your code in this file.
/**
 * Hàm này sẽ dùng để tổng hợp thông tin và tạo claims của user
 * và bỏ vào trong token trước khi tạo token. Hoạt động với cả
 * khi sign in và refresh tokens.
 *
 * @param event - lambda event
 * @param context - lambda context
 *
 * @returns
 */
export async function handler(event: any, context: any) {
  // Lấy thông tin từ userAttributes
  const userAttrs = event.request.userAttributes;

  const role = userAttrs["custom:role"] || "";
  const fullName = userAttrs["name"];

  // Gán lại response với claims và scopes
  event.response = {
    claimsAndScopeOverrideDetails: {
      idTokenGeneration: {
        claimsToAddOrOverride: {
          "custom:role": role,
          full_name: fullName,
        },
      },
      accessTokenGeneration: {
        claimsToAddOrOverride: {
          "custom:role": role,
        },
        scopesToAdd: role ? [`role:${role}`] : [],
      },
    },
  };

  return event;
}

8.1.1

Python

  1. In your local project, go to src/runtimes/lambda_functions.
  2. Create a folder authorizer and inside it, create pre_token_generation_trigger.py.
  3. Add your code in this file.
def handler(event, context):
    """
    Hàm này sẽ dùng để tổng hợp thông tin và tạo claims của user
    và bỏ vào trong token trước khi tạo token. Hoạt động với cả
    khi sign in và refresh tokens.

    :param event: lambda event
    :param context: lambda context
    :return: event với response được gán thêm claims
    """

    # Lấy thông tin từ userAttributes
    user_attrs = event["request"]["userAttributes"]

    role = user_attrs.get("custom:role", "")
    full_name = user_attrs.get("name", "")

    # Gán lại response với claims và scopes
    event["response"] = {
        "claimsAndScopeOverrideDetails": {
            "idTokenGeneration": {
                "claimsToAddOrOverride": {
                    "custom:role": role,
                    "full_name": full_name,
                },
            },
            "accessTokenGeneration": {
                "claimsToAddOrOverride": {
                    "custom:role": role,
                },
                "scopesToAdd": [f"role:{role}"] if role else [],
            },
        },
    }

    return event

8.1.2

Push Lambda Trigger

Upload the Lambda function to AWS:

  1. Go to Lambda in AWS Console.

8.1.3

  1. In the right menu, select FunctionsCreate function.

8.1.4

TypeScript

  • For simplicity, remove typings from your TypeScript code. If you use multiple libraries, consider Esbuild to bundle into a single JS file.

8.1.5

  • Create function:
    • Name: pre-token-generation-trigger-js
    • Runtime: Node.js 22.x
    • Architecture: x86_64

8.1.7 8.1.8

  • Copy your built code into the Lambda editor and deploy.

8.1.9

Python

  • Create function:
    • Name: pre-token-generation-trigger-py
    • Runtime: Python 3.12
    • Architecture: x86_64

8.1.10 8.1.11

  • Copy code into the editor.

8.1.12

  • Edit handler to lambda_function.handler and Save.

8.1.13 8.1.14

  • Deploy the new code.

8.1.15

Now the Lambda trigger is ready. Next, we will attach it to the Cognito pre-token generation trigger.