Amplify Gen 2: ошибка лямбда-функции «Нет федеративного jwt»

У меня есть приложение Amplify, использующее Cognito для аутентификации пула пользователей. После того как пользователь зарегистрировался и использовал код, отправленный по электронной почте (все функции Cognito), он передается в специальную форму, в которой фиксируется дополнительная информация. При отправке выполняется лямбда-функция, которая должна:

  1. Создать группу в Cognito
  2. Добавить пользователя в группу
  3. Создайте запись в таблице DynamoDB и используйте имя группы, созданное на шаге 1. в полях writeGroups, указанных в схеме дляallow.groupsDefinedIn('writeGroups').

Лямбда-функция прекрасно развертывается как часть моей песочницы, и для allow.resource(createAccount).to(["manageGroups", "addUserToGroup", "manageGroupMembership"])} были предоставлены разрешения, а также для изменения данных DynamoDB. Однако как только CognitoIdentityProviderClient или await client.models.User.create(user) нажимаются изнутри лямбда-функции, я получаю следующую ошибку от Graphql API No federated jwt. Пример используемого кода:

const user = {
  userId: userId,
  ...
};
const { data, errors} = await client.models.User.create(user);   <-- `No federated jwt` error thrown here

Или

const cognitoClient = new CognitoIdentityProviderClient();
const userGroup = {
  GroupName: `GroupName`,
  Precedence: 1,
  Description: `Description`,
  UserPoolId: userPoolId,
};
const createCommand = new CreateGroupCommand(userGroup);
const response = await cognitoClient.send(createCommand );    <-- `No federated jwt` error thrown here

Примеры в документации Amplify Gen 2 не охватывают этот сценарий. Что мне не хватает?

Где возникает ошибка? внутри Lambda или при вызове Lambda из внешнего интерфейса?

Ankush Jain 10.07.2024 08:48

Ошибка возникает в лямбде. Возможно, мне следует использовать другой подход для взаимодействия с Cognito и DynamoDB из лямбда-функции?

Jonny 10.07.2024 10:26

Я решил проблему с Cognito, используя следующий клиент: let cognito = new AWS.CognitoIdentityServiceProvider(); ...тогда ждите cognito.createGroup(readGroup, function(err, data) {..... Мне просто нужно решить, как получить доступ к DynamoDB с учетными данными IAM через эту сгенерированную функцию Amplify, и я дам ответ на этот вопрос проясняю неправильный подход, который я изначально использовал

Jonny 10.07.2024 15:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если модель данных пользователя настроена так, чтобы разрешать создание только владельцу или аутентифицированным пользователям, вам необходимо установить для параметра authMode для команды client.models.user.create значениеidentPool и передать пользовательский jwtToken. Токен можно получить из заголовка, если вы используете APIGateway для вызова лямбды. Если вы не используете шлюз API, вам придется передать его самостоятельно.

Вот пример данных

const schema = a.schema({
  User: a
    .model({
      name: a.string(),
      group: a.string(),
    })
    .identifier(["User"]),
})
.authorization((allow) => [allow.owner()]);

export type Schema = ClientSchema<typeof schema>;

export const data = defineData({
  schema,
  authorizationModes: {
    defaultAuthorizationMode: "identityPool",
  },
});

А вот пример лямбды, вызываемой с использованием APIGateway

export const handler: APIGatewayProxyHandler = async (event) => {

    let jwtToken: string | undefined;

    // Method 1: From JWT authorizer claims
    jwtToken = event.requestContext.authorizer?.jwt?.claims?.['id_token'] as string;

    // Method 2: From Authorization header (if token is passed in header)
    if (!jwtToken) {
        const authHeader = event.headers['Authorization'];
        jwtToken = authHeader;
    }
    if (jwtToken) {
        console.info('jwtToken found:', jwtToken);
        // Use the jwtToken as needed
    } else {
        console.info('jwtToken not found in the request');
    }

      const client = generateClient<Schema>({
        authMode: "identityPool",
        authToken: jwtToken,

      });
      const createStoryResult = await client.models.User.create({
        name: "foo",
        group: "Bar",
        },
      {
        authMode: "identityPool",
        authToken: jwtToken,
      });

Спасибо, Эндрю, добавление токена JWT помогло. У меня он находился в немного другом месте, в event.request.headers['authorization']

Jonny 11.07.2024 22:02

Другие вопросы по теме