#amazon-web-services #authentication #aws-lambda #amazon-cognito #password-less
#amazon-web-services #аутентификация #aws-lambda #amazon-cognito #без пароля
Вопрос:
Итак, в настоящее время я использую лямбды AWS в качестве триггеров для моей аутентификации без пароля Cognito. Для триггера create_auth_challenge у меня есть функция AWS Lambda, которая отправляет ссылку пользователю, чтобы перенаправить их куда-нибудь на основе среды. Единственная проблема заключается в том, что я не уверен, как динамически сообщать функции, из какой среды поступает запрос аутентификации.
AWS.config.update({ region: 'us-west-2' });
const SES = new AWS.SES();
exports.handler = async (event,context) => {
console.log("HERE: ", event,context);
let secretLoginCode;
if (!event.request.session || !event.request.session.length) {
// Generate a new secret login code and send it to the user
secretLoginCode = Date.now().toString().slice(-4);
try {
if ('email' in event.request.userAttributes) {
const emailResult = await SES.sendEmail({
Destination: { ToAddresses: [event.request.userAttributes.email] },
Message: {
Body: {
Html: {
Charset: 'UTF-8',
Data: `<html><body><p>This is your secret login code:</p>
<h3>Your magic link: ${INSERT ENVIRONMENT HERE}/api/auth/cognito/verify?email=${event.request.userAttributes.email}amp;code=${secretLoginCode}</h3></body></html>`
},
Text: {
Charset: 'UTF-8',
Data: `Your magic link: ${INSERT ENVIRONMENT HERE}/api/auth/cognito/verify?email=${event.request.userAttributes.email}amp;code=${secretLoginCode}`
}
},
Subject: {
Charset: 'UTF-8',
Data: 'Your magic link'
}
},
Source: 'Company <no-reply@company.com>'
}).promise();
}
} catch (error) {
console.log(error)
}
} else {
// re-use code generated in previous challenge
const previousChallenge = event.request.session.slice(-1)[0];
secretLoginCode = previousChallenge.challengeMetadata.match(/CODE-(d*)/)[1];
}
// Add the secret login code to the private challenge parameters
// so it can be verified by the "Verify Auth Challenge Response" trigger
event.response.privateChallengeParameters = { secretLoginCode };
// Add the secret login code to the session so it is available
// in a next invocation of the "Create Auth Challenge" trigger
event.response.challengeMetadata = `CODE-${secretLoginCode}`;
return event;
};```
This is a magic link authentication by the way.
Комментарии:
1. Если у вас есть уникальные лямбда-функции, по одной на среду, вы можете просто добавить переменную окружения Lambda в свою лямбда-функцию во время развертывания (например, ENV=prod) и прочитать это в лямбда-функции. Если несколько сред выполнения запускают одну и ту же лямбда-функцию, вам может потребоваться вывести среду из
event
илиcontext
, предоставленного при вызове вашей лямбды.2. Да, у меня есть несколько сред, поэтому план состоит в том, чтобы динамически изменять перенаправление, но если я соглашусь с тем, что вы предлагаете, как мне передать среду через событие или контекст. Мой текущий пользовательский процесс проверки подлинности выглядит следующим образом: предварительная регистрация -> define_auth_challenge проверка подлинности -> create_auth_challenge -> veryify_auth_challenge
3. Возможно, я неправильно понял ваш вопрос. Я говорю, что каждая лямбда-функция будет развернута с другим значением переменной среды ENV (или как вы хотите это назвать). Это не будет присутствовать в событии или контексте. Он статически доступен в среде каждой лямбда-функции. Ваш инструмент развертывания будет соответствующим образом настроен при загрузке пакета лямбда-функций для каждого из prod / qa / dev / чего угодно.
4. См . docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html
5. Это один и тот же лямбда-код в каждой среде. Пользователи вашего API используют одну из N идентичных лямбда-функций, в зависимости от того, с какой средой связаны эти потребители. Лямбда-функция выдает URL-адрес перенаправления для конкретной среды на основе лямбда-переменной среды.