掌握AWS Cognito:用户属性的最终指南
#aws #javascript #node #cognito

啊,aws cognito!托管身份验证提供商承诺会顺利进行航行,但偶尔会感觉更像是在浏览百慕大三角形。

如果您是通过Cognito水域涉水的开发人员,则可能与将键盘用作飞盘的冲动有关。

这是与AWS Cognito一起浏览我的过山车的一眼,以及我如何完成。

Image description

序言:简单的道路经常被遗忘

在我们冒险进入模糊的水域之前,这里有一个金色的建议:每当您创建或获取用户时,请始终存储Cognito用户名(本质上是Cognito ID)。这个谦虚的弦可能是您绕过很多头痛的神奇钥匙。这样,更新用户属性很简单:

async function directUpdateUsingUsername(username: string, attributes: any) {
    await cognito.adminUpdateUserAttributes({
        UserPoolId: process.env.COGNITO_USER_POOL_ID,
        Username: username,
        UserAttributes: attributes
    });
}

在前端,您可以使用getCurrentuser轻松获得此功能。将其保留在您的武器库中。

1.基础:更新用户属性

将用户属性设置在Cognito中,而不知道它的用户名就像试图说服猫洗澡。有可能,但要为某种抵抗做好准备。

import { CognitoIdentityProvider } from "@aws-sdk/client-cognito-identity-provider";

const cognito = new CognitoIdentityProvider({
    region: process.env.AWS_REGION
});

async function updateUserAttributes(username: string, attributes: any) {
    await cognito.adminUpdateUserAttributes({
        UserPoolId: process.env.COGNITO_USER_POOL_ID,
        Username: username,
        UserAttributes: attributes
    });
}

注意:记住要优雅处理任何错误。 cognito可以是...刺。

2.查找Nemo:通过电子邮件搜索(或其他标准属性)

您可能不知道用户的Cognito ID,但是您可能会有他们的电子邮件!这是您开始寻找它们的方式:

async function findUserByEmail(email: string) {
    const users = await cognito.listUsers({
        UserPoolId: process.env.COGNITO_USER_POOL_ID,
        Filter: `email = "${email}"`,
        Limit: 1
    });

    if (users && users.Users && users.Users.length > 0) {
        return users.Users[0];
    }
    throw new Error("User not found!");
}

3.失望:自定义属性无法搜索! ð

有人可能会想:“哦,我有这样的习惯:Unicornattribute。我可以搜索!”但是不,Incognito再次挫败了我们。以为您可以按自定义搜索:myfavoriteColor? Cognito嘲笑我们的天真乐观。自定义属性就像您最喜欢的咖啡馆的秘密菜单一样:它们存在,但您不能直接从它们订购。

4.迭代搜索:当其他所有失败时...

如果您迫切希望通过自定义属性找到用户,则有一种(效率低下的)方式:列出所有用户并搜索客户端。 (只有在您感到勇敢并拥有并以其他方式时才执行此操作)

async function findUserByCustomAttribute(attributeName: string, value: string) {
    let paginationToken;
    do {
        const result = await cognito.listUsers({
            UserPoolId: process.env.COGNITO_USER_POOL_ID,
            PaginationToken: paginationToken
        });

        for (const user of result.Users) {
            for (const attr of user.Attributes) {
                if (attr.Name === attributeName && attr.Value === value) {
                    return user;
                }
            }
        }

        paginationToken = result.PaginationToken;
    } while (paginationToken);

    throw new Error("User not found!");
}

综上所述:

aws cognito及其怪癖和特质,可能是驯服的野兽。但是,有了一阵耐心,一点点幽默,甚至是一杯酒(或两杯),您可以征服它!