啊,aws cognito!托管身份验证提供商承诺会顺利进行航行,但偶尔会感觉更像是在浏览百慕大三角形。
如果您是通过Cognito水域涉水的开发人员,则可能与将键盘用作飞盘的冲动有关。
这是与AWS Cognito一起浏览我的过山车的一眼,以及我如何完成。
序言:简单的道路经常被遗忘
在我们冒险进入模糊的水域之前,这里有一个金色的建议:每当您创建或获取用户时,请始终存储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及其怪癖和特质,可能是驯服的野兽。但是,有了一阵耐心,一点点幽默,甚至是一杯酒(或两杯),您可以征服它!