4

Как я могу отправить сообщение электронной почты/активировать функцию лямбда при регистрации нового пользователя?отправлять электронную почту при регистрации пользователей - AWS Cognito federated Identities

Под «редактированием пула идентификаторов» я нашел только триггер синхронизации. Если я правильно понимаю: это срабатывает каждый раз, когда пользователь синхронизирует свои данные ...
Есть ли способ вызвать функцию лямбда только для «начальной» синхронизации или когда определенный набор данных создан для пользователя?

enter image description here

Edit:
Чтобы быть более конкретным: я создать пользователя с помощью лямбды с помощью JS SDK. Я использую аутентификацию разработчика с собственным потоком oauth2. Я не знаю, как различать пользователя, предоставляющего доступ, например. через Google в первый раз от кого-то, делающего это во второй раз. Json с кодом доступа шов же мне ... Может быть, я ошибаюсь.

Также с помощью вызова getOpenIdTokenForDeveloperIdentity я не знаю, как отличить ID от новичка от когнито от одного когнито уже знает.

Edit 2: Чтобы быть еще более точным: я строй на этом проекте: https://github.com/laardee/serverless-authentication-boilerplate/blob/master/authentication/lib/storage/usersStorage.js

вот как я могу сохранить Пользователь к Cognito в данный момент. Я запускаю этот код для пользователей в первый раз, а также пользователей nth time. Моя проблема заключается в том, что я не знаю, как отличить ...

const saveCognito = (profile) => new Promise((resolve, reject) => { 
    if (profile) { 
    cognitoidentity.getOpenIdTokenForDeveloperIdentity({ 
     IdentityPoolId: process.env.COGNITO_IDENTITY_POOL_ID, 
     Logins: { 
     // profile.userId = encrypted id of the e.g. google oauth2 id 
     [process.env.COGNITO_PROVIDER_NAME]: profile.userId 
     } 
    }, (err, dat) => { 
     if (err) { 
     reject(err); 
     } else { 
     var list_params = { 
      DatasetName: 'user-data', /* dataset name */ 
      IdentityId: dat.IdentityId, /* cognito id */ 
      IdentityPoolId: process.env.COGNITO_IDENTITY_POOL_ID 
     }; 
     cognitosync.listRecords(list_params, function(err, data) { 
      if (err) { 
      reject(err); // an error occurred 
      } else { 

      var RecordPatches = //[Parts of the i want to write to the user] 
      // SyncSessionToken is returned by the cognitosync.listRecords call 
      list_params["SyncSessionToken"] = data.SyncSessionToken; 
      list_params["RecordPatches"] = RecordPatches; 

      cognitosync.updateRecords(list_params, function(err, update_data) { 
       if (err){ 
       reject(err); 
       } else { 
       resolve(); 
       } 
      }); 
      } 
     }); 
     } 
    }); 
    } else { 
    reject('Invalid profile'); 
    } 
}); 
+0

Я предполагаю, что фактические пользователи создаются не с лямбды? – Erndob

+0

@Erndob см. Мое редактирование/расширение для вопросов – Rentrop

+0

Для создания пользователей у вас есть лямбда, которая добавляет их в пул, это отличает от входа в систему, не можете ли вы просто запустить отправку электронной почты лямбда из вашей регистрирующей лямбда? – Erndob

ответ

3

Так что это то, что в настоящее время не поддерживается в Cognito из коробки. Вы правы, говоря, что единственным встроенным событием Cognito, которое вызовет функцию лямбда-функции, является событие «Sync Trigger». Это событие Sync запускается каждый раз, когда Cognito IdentityId синхронизирует некоторые свои данные с хранилищем данных Cognito Sync.

Это событие не связано с созданием нового IdentityId от Cognito Federated Identity.

Вы могли бы в теории:

  • Выполнить список дества слово IdentityPool, до входа пользователя в
  • Логин пользователя.. Проверьте, присутствует ли идентификатор IdentityId, который был предоставлен пользователю, в списке, который вы получили до того, как он зарегистрировался в . Это сообщит вам, существует ли идентификатор, который они были , перед этим входом в систему.
  • На основании этой информации вы можете принять решение о том, следует ли программно вызывать функцию Lambda из вашего приложения.

Установка вышеуказанного будет сложной, так как по соображениям безопасности вам необходимо будет поддерживать эту службу на стороне сервера. Для вызова списка имен требуется учетные данные AWS для вызова. И я сомневаюсь, что вы захотите включить разрешения для этого вызова в политику IAM для пользователей, не прошедших проверку подлинности.

Помимо вышеизложенного, на данный момент вы не можете многое сделать. Для этого вам необходимо настроить таблицу DynamoDB (или некоторое подобное хранилище данных с низкой задержкой), в котором вы могли бы поддерживать состояние списка IdentityId, а затем запрашивать эту службу/хранилище всякий раз, когда вы входите в систему для пользователя, чтобы сравнить новые логины к существующему списку.

Если это имеет решающее значение для вашего варианта использования, я бы предложил перейти к поддержке AWS и создать случай, когда вы можете зарегистрировать это как запрос функции.

https://aws.amazon.com/premiumsupport/

+0

спасибо за ответ. Жаль, что это не реализовано (еще?). Я тестировал когнито, чтобы использовать его в проекте. Это важно в моем рабочем процессе, но, как студент, к сожалению, у меня нет доступа к premiumsupport ... :( Единственное альтернативное решение для вашего предложения, которое я могу придумать: Если 'listRecords' возвращает пустой-набор данных => Пользователь us new => Отправить сообщение по электронной почте Это должно работать, поскольку я защищаю информацию __ profile__, собранную, например, от Google для каждого пользователя. Таким образом, у моего пользователя будет набор записей 'user-data' – Rentrop

+1

. Это тоже хорошее решение, проверяя набор данных , чтобы убедиться, что он пуст, а затем вставлять некоторые данные в записи, чтобы показать, что пользователь не является новым. Да, я был там, я был студентом, работающим над этим материалом, так что я знаю, как он себя чувствует :) –