Cognito 从一个 AWS 账户迁移到另一个 AWS 账户,无需更改子账户

问题描述 投票:0回答:1

我们目前在一个 AWS 账户中使用 Cognito,并希望迁移到另一个账户。但是,当我们在新帐户的用户池中使用 Lambda 触发器时,登录时会创建一个新用户,包括所有属性,并且用户的子目录将发生变化,因为帐户之间的子目录不同。我们的 Cognito 设置与 API 网关集成,我们依靠子系统来跟踪用户,这是迁移过程中的主要问题。

虽然我们可以创建一个自定义属性并使用户强制使用该属性而不是使用子属性,但这会引发另一个问题。如果我们实现自定义属性,它在迁移过程中不会改变,但我们仍然需要一种可靠的方法来跟踪 MongoDB 数据库中的用户。如果我们不再使用子系统,我们如何才能有效地跟踪用户

请建议我一种迁移认知用户池的简单方法

import boto3

def lambda_handler(event, context): 

    username = event['userName']
    password = event['request']['password']
    
    # Initialize Cognito clients for old and new user pools
    old_cognito_client = boto3.client('cognito-idp', region_name='us-east-1')
    new_cognito_client = boto3.client('cognito-idp', region_name='us-east-1')

    old_user_pool_id = 'us-east-1_hfa37RQDe'  # Dev User Pool ID

    try:
        # Authenticate against the old user pool
        response = old_cognito_client.initiate_auth(
            UserPoolId=old_user_pool_id,
            ClientId='egshhhrhhdh',  # Replace with your actual dev client ID
            AuthFlow='USER_PASSWORD_AUTH',
            AuthParameters={
                'USERNAME': username,
                'PASSWORD': password,
            }
        )

        # Get user attributes from the old user pool
        user_attributes = {attr['Name']: attr['Value'] for attr in response['UserAttributes']}
        original_sub = user_attributes.get('sub')  # Get the original sub value

        # Create the user in the new pool (prod) with the original sub as a custom attribute
        new_cognito_client.admin_create_user(
            UserPoolId='us-east-1_ieJhg8gfefasfefesGUx',  # Prod User Pool ID
            Username=username,
            UserAttributes=[
                {
                    'Name': 'email',
                    'Value': user_attributes.get('email', '')  # Get email if exists, default to empty string
                },
                {
                    'Name': 'custom:old_sub',
                    'Value': original_sub  
                },
            ]
        )

        return {
            'userAttributes': {
                'email': user_attributes.get('email', ''),
            },
            'response': {
                'statusCode': 200,
                'body': 'User migrated successfully!',
            },
        }

    except Exception as e:
        # Handle exceptions
        return {
            'statusCode': 500,
            'body': f'Error: {str(e)}'
        }
amazon-web-services aws-lambda amazon-cognito amazon-cognito-triggers
1个回答
0
投票

为了确保在新注册和迁移的帐户中对用户进行一致的跟踪,您可以引入一个自定义的、不可写的属性

custom:userId
。此属性提供了您控制的稳定标识符,避免了对跨用户池可能发生变化的子属性的依赖。

对于迁移的用户: 在迁移过程中,将每个用户的现有子值分配给 custom:userId。这与之前的标识符保持了连续性。

对于新注册: 为每个用户生成一个新的唯一标识符,并在注册时将其存储在 custom:userId 中。

通过这种方法,

custom:userId
成为整个系统中一致的标识符,统一新老用户的用户跟踪。

在API网关中访问

custom:userId
在大多数设置中,使用 IAM 授权时,默认情况下,自定义属性不包含在 API Gateway 事件中。要解决此问题:

选项 1: 包含 idToken:要求用户在每次请求时发送其 idToken。该令牌默认包含 custom:userId 属性。

选项 2: 将访问令牌与预令牌生成触发器结合使用:如果您更喜欢使用 accessToken(例如,为了更短的有效期或其他好处),请在 AWS Cognito 中设置预令牌生成触发器。此触发器可以将 custom:userId 添加到 accessToken,使其在令牌有效负载中可用。

在后端逻辑中,解码令牌并检索 custom:userId 以进行数据库操作和跟踪目的。 不要忘记在使用前验证令牌,以防止冒充或权限升级!此设置提供了稳定且自定义控制的标识符,可简化不同用户池和访问流之间的用户管理。

© www.soinside.com 2019 - 2024. All rights reserved.