如何修改Cognito Userpool的自定义属性?

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

我已经提出了需要登录和注册的申请。用户的数据字段类似于(姓名、电子邮件地址、密码和角色类型(默认为访客)。因此有两个角色 - 管理员和访客。我有一个名为“用户管理”的页面,在其中我可以将用户类型从管理员更改为访客反之亦然。我之前通过将用户数据存储在数据库中并通过典型的 API 请求修改该用户的角色来实现这一点,现在,我转向使用 AWS Cognito 来存储和管理我拥有名称的所有用户。像往常一样,电子邮件和密码,对于角色,我必须创建一个名为角色的自定义属性(像这样的自定义:角色),然后我可以拥有与以前相同的参数现在我想知道如何显示所有用户和。还可以使用 UI 中的 Cognito 将其自定义:角色类型属性从访问者更改为管理员,反之亦然。我是否需要实现一个 API 来处理此问题,或者你们对此有其他想法吗?
我认为,默认情况下,Cognito 不允许更改其他用户的属性。 任何想法或建议都表示赞赏。

这是我的注册方式,供参考

import React, { useState } from 'react';
import { toast, Toaster } from 'react-hot-toast';
import { useNavigate, Link } from 'react-router-dom';
import UserPool from './UserPool';

const Signup = () => {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [confirmPassword, setConfirmPassword] = useState('');
  const [name, setName] = useState('');
  const navigate = useNavigate();

  const handleSignup = async (e) => {
    e.preventDefault();
    if (password !== confirmPassword) {
      toast.error('Passwords do not match');
      return;
    }

    try {
      await new Promise((resolve, reject) => {
        UserPool.signUp(
          email,
          password,
          [
            { Name: 'name', Value: name },
            { Name: 'email', Value: email },
            { Name: 'custom:role', Value: 'admin' }
          ],
          null,
          (err, data) => {
            if (err) reject(err);
            else resolve(data);
          }
        );
      });

      toast.success('Signup successful. Please check your email for the confirmation code.', {
        duration: 3000,
        onClose: () => navigate('/confirm-email'),
      });
    } catch (err) {
      console.error(err);
      toast.error(err.message || 'An error occurred. Please try again.');
    }
  };

这就是我的用户池的样子:

import { CognitoUserPool } from "amazon-cognito-identity-js";
import { cognito_user_pool_id , cognito_client_id  } from "../utils/config";

const poolData = {
  UserPoolId: cognito_user_pool_id,
  ClientId: cognito_client_id,
};

export default new CognitoUserPool(poolData);
reactjs amazon-web-services amazon-cognito amazon-cognito-triggers amazon-cognito-identity-js
1个回答
0
投票

Apporch 1:使用前端

用户属性直接从

frontend using AWS Amplify's Auth module
更新,它检索当前经过身份验证的用户并异步更新其属性。这种方法很简单,并且允许实时更新,但需要在客户端正确处理身份验证和错误管理。

async function updateUserAttribute(attributeKey: string, value: string) {
  try {
    // Get the current authenticated user
    const currentUser = await Auth.getCurrentUser();
    // Update the user attribute
    const result = await Auth.updateUserAttributes(currentUser, {
      [attributeKey]: value,
    });

    // Check if the update was successful
    console.log(`Successfully updated ${attributeKey} to ${value}.`);
  } catch (error) {
    console.error("Error updating user attribute:", error);
  }
}


updateUserAttribute("custom:myCustomAttribute", "New Value");

Apporch 2:使用 CKD python(更容易)

利用 AWS Lambda 和 Python 的 Boto3 SDK 以编程方式更新用户属性。 Lambda 函数接收请求正文,提取用户的电子邮件和属性,然后调用 admin_update_user_attributes。这种服务器端方法通过在一个位置管理属性更新来简化属性更新,但它需要 IAM 权限来确保对 Cognito 用户池的安全访问

def update_user(body):
    data = json.loads(body)
    email = data.get("email")
    attributes_to_update = data.get("attributes", {})

    user_attributes = []
    for key, value in attributes_to_update.items():
        user_attributes.append({"Name": key, "Value": value})

    try:
        cognito_client.admin_update_user_attributes(
            UserPoolId=user_pool_id, Username=email, UserAttributes=user_attributes
        )
        return {"statusCode": 200, "body": json.dumps("User updated successfully")}
    except Exception as e:
        return {"statusCode": 500, "body": json.dumps(str(e))}

注:

  • 要执行
    admin_update_user_attributes
    函数,Lambda 函数必须具有对指定的执行此操作的权限 Cognito 用户池。这需要以下 IAM 策略 权限:

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