Как выполнить перенаправление после подтверждения Amazon Cognito с помощью URL-адреса подтверждения?

Я хочу перенаправить на определенный URL-адрес после подтверждения пользователя в Amazon Cognito.

Когда пользователь зарегистрируется, он получит письмо с подтверждением со ссылкой для подтверждения следующего вида: https://%3C%3Cmy-prefix%3E%3E.auth.us-west-2.amazoncognito.com/confirmUser?client_id=%3C%3C%3E%3E&user_name=%3C%3C%3E%3E&confirm_code=%3C%3C%3E%3E

Если пользователь щелкнет указанную выше ссылку, он будет перенаправлен на страницу подтверждения.

Как только пользовательское подтверждение будет завершено, страница должна перенаправить на мое приложение.

Пожалуйста, дайте мне какое-нибудь представление о том, как решить эту проблему.


person Richardson. M    schedule 07.11.2017    source источник


Ответы (4)


В настоящее время это перенаправление невозможно выполнить с помощью ссылки для подтверждения в электронном письме. Некоторое время назад я пытался добавить redirect_uri к URL-адресу подтверждения, но они не работают.

Временное решение

  • Создайте API в шлюзе Api, который принимает эти 3 параметра и дополнительный параметр redirect_uri. В бэкэнд-лямбде сделайте запрос GET к фактической ссылке, используя параметры и подтвердите пользователя. В случае успеха верните 302 редирект из вашего API, используя параметр redirect_uri в качестве параметра.
  • В пуле пользователей используйте триггер настраиваемого сообщения для создания ссылки на API-интерфейс шлюза API вместо URL-адреса когнито по умолчанию.
  • Таким образом, ссылка для подтверждения будет выглядеть примерно так: https://myapi.abc.com/confirm?client_id=somevalue&user_name=some_user&confirmation_code=some_code&redirect_uri=https://myapp.com
  • Эти значения передаются бэкэнд-лямбда, который делает запрос GET к https://your_domain.auth.us-west-2.amazoncognito.com/confirmUser?client_id=somevalue&user_name=some_user&confirmation_code=some_code

  • В случае успеха верните 302 https://myapp.com со своего шлюза API.

Я знаю, что это запутанный обходной путь для такого простого требования. Лучшим способом было бы подать запрос функции и надеяться, что они поддерживают redirect_uri в URL-адресе Cognito.

ИЗМЕНИТЬ

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

POST  HTTP/1.1
Host: cognito-idp.us-east-1.amazonaws.com
x-amz-target: AWSCognitoIdentityProviderService.ConfirmSignUp
Content-Type: application/x-amz-json-1.1

{
  "ClientId":"xxxxxxxxxxxxx",
  "ConfirmationCode":"123456",
  "Username":"username"
}
person agent420    schedule 07.11.2017
comment
Какие заполнители использовать для кода подтверждения, идентификатора клиента, имени_пользователя и т. Д. В URL-адресе: myapi.abc.com/ - я не могу найти его в документации по когнитивному анализу. - person vrtx54234; 08.11.2017
comment
Вам нужно будет установить это сообщение с помощью настраиваемого лямбда-триггера сообщения. Код подтверждения: event.request.codeParameter, имя пользователя - event.request.userAttributes. Просто зарегистрируйте объект «событие» и просмотрите все доступные значения. - person agent420; 08.11.2017
comment
comment
Так ли это до сих пор? Почему же тогда в настройках клиента приложения в когнитивном режиме есть URL-адреса обратного вызова? - person Munib; 14.08.2018
comment
Обратные вызовы предназначены для аутентификации, то есть входа в систему, а не подтверждения - person agent420; 15.08.2018
comment
Можно ли использовать эту же технику для забытого пароля? - person Cliff Helsel; 20.06.2019

Я заставил это работать с помощью приведенного выше ответа от @ agent420 и изучения проблемы с github https://github.com/aws-amplify/amplify-js/issues/612

Итак, вот полный процесс, которому я следовал.

  • Сначала нам нужно изменить метод проверки на код по ссылке, поскольку нам нужно получить код при подтверждении пользователя с помощью лямбда. Для этого в Cognito (Консоль AWS) перейдите в Настройки сообщений -> Тип проверки, измените его на «Код».
  • Затем мы добавим лямбда-триггер, который будет срабатывать перед отправкой подтверждения по электронной почте. Чтобы добавить лямбда для этого, перейдите в Lambda (Консоль AWS) и создайте функцию. Ниже приведена лямбда, которую я использовал.

exports.handler = (event, context, callback) => {
    // Identify why was this function invoked
    if(event.triggerSource === "CustomMessage_SignUp") {
        console.log('function triggered');
        console.log(event);
        // Ensure that your message contains event.request.codeParameter. This is the placeholder for code that will be sent
        const { codeParameter } = event.request
        const { userName, region } = event
        const { clientId } = event.callerContext
        const { email } = event.request.userAttributes
        const url = 'https://example.com/api/dev/user/confirm'
        const link = `<a href="${url}?code=${codeParameter}&username=${userName}&clientId=${clientId}&region=${region}&email=${email}" target="_blank">here</a>`
        event.response.emailSubject = "Your verification link"; // event.request.codeParameter
        event.response.emailMessage = `Thank you for signing up. Click ${link} to verify your email.`;
    }

    // Return to Amazon Cognito
    callback(null, event);
};

Ваше письмо будет отправлено с темой и сообщением, указанными в event.response.emailSubject и event.response.emailMessage. Пользователь будет перенаправлен на URL-адрес, указанный в переменной url.

  • Чтобы добавить триггер, перейдите к, Cognito (Aws-console) Triggers -> Custom message и выберите только что созданную лямбду.
  • Поскольку пользователь будет направлять на наш URL-адрес, мы можем управлять запросом, подтверждать пользователя и перенаправлять на выбранный вами URL-адрес.

Я использовал для этого лямбду с использованием AWS APIGateway. Ниже приведен код, который я написал в nodejs, где я использовал перенаправление 301.

'use strict';
var AWS = require('aws-sdk');
AWS.config.setPromisesDependency(require('bluebird'));
var CognitoIdentityServiceProvider = new AWS.CognitoIdentityServiceProvider({ apiVersion: '2016-04-19', region: process.env.REGION });

module.exports.verifyEmailAddress = (req, context, callback) => {

  console.log('req');
  console.log(req);
  const confirmationCode = req.queryStringParameters.code
  const username = req.queryStringParameters.username
  const clientId = req.queryStringParameters.clientId
  const region = req.queryStringParameters.region
  const email = req.queryStringParameters.email

  let params = {
    ClientId: clientId,
    ConfirmationCode: confirmationCode,
    Username: username
  }

  var confirmSignUp = CognitoIdentityServiceProvider.confirmSignUp(params).promise()

  confirmSignUp.then(
    (data) => {
      let redirectUrl = process.env.POST_REGISTRATION_VERIFICATION_REDIRECT_URL;
      const response = {
        statusCode: 301,
        headers: {
          Location: redirectUrl,
        }
      };
    
      return callback(null, response);
    }
  ).catch(
    (error) => {
      callback(error)
    }
  )
}

Замените переменные окружения REGION и POST_REGISTRATION_VERIFICATION_REDIRECT_URL на свои значения в соответствии с требованиями.

person Yasith Prabuddhaka    schedule 12.08.2019
comment
Есть ли способ повторно отправить письмо с подтверждением. Так, например, повторно запустить CustomMessage_SignUp? - person CodingYourLife; 23.10.2020

Полное руководство по установке.

Полная ссылка на статью: https://medium.com/@jacobjoy/redirect-user-using-amazon-cognito-confirmation-url-d8ccb11bac75

Спасибо @yasith, начиная с простого изображения, чтобы прояснить, как мы делаем эту работу,

введите здесь описание изображения Шаг 1. Создайте лямбда-функцию на языке по вашему выбору. В следующем примере я буду использовать node.js. Прежде чем продолжить, прочтите "Пользовательский лямбда-триггер сообщения", https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-custom-message.html В этом примере я обрабатываю только CustomMessage_SignUp, который вы можете настроить для других, например CustomMessage_ForgotPassword и т. Д. В соответствии с вашими требованиями. Скопируйте приведенный ниже код в свою лямбда-функцию,

// Creating a custom URL for the user
exports.handler = (event, context, callback) => {
    if(event.triggerSource === "CustomMessage_SignUp") {
        const { codeParameter } = event.request;
        const { userName, region } = event;
        const { clientId } = event.callerContext;
        const { email } = event.request.userAttributes;
        const url = 'https://xxxxxxx.execute-api.eu-west-2.amazonaws.com/prod/redirect'
        const link = `<a href="${url}?code=${codeParameter}&username=${userName}&clientId=${clientId}&region=${region}&email=${email}" target="_blank">Click the link to verify</a>`;
        event.response.emailSubject = "Your verification link";
        event.response.emailMessage = `Thank you for signing up. Click ${link} to verify your email.`;
    }
// CallBack to the lambda for the email trigger
    callback(null, event);
};

Примечание. Константный URL следует обновить после настройки шлюза API.

Шаг 2: Под Cognito Trigger выберите настраиваемое сообщение и выберите созданную вами лямбда-функцию.

Шаг 3. Создайте GET API в своем API-шлюзе. Не устанавливайте авторизацию и не активируйте требуемый ключ API.

введите описание изображения здесь  введите описание изображения здесь Шаг 4: Создайте еще одну лямбда-функцию для проверки и подтверждения пользователя.

'use strict';
var AWS = require('aws-sdk');
AWS.config.setPromisesDependency(require('bluebird'));
var CognitoIdentityServiceProvider = new AWS.CognitoIdentityServiceProvider({
    apiVersion: '2019-11-07',
    region: process.env.REGION
});
exports.handler = (req, context, callback) => {
console.log(req);
    const confirmationCode = req.code;
    const username = req.username;
    const clientId = req.clientId;
let params = {
        ClientId: clientId,
        ConfirmationCode: confirmationCode,
        Username: username
    };
//Validating the user
let confirmSignUp = CognitoIdentityServiceProvider.confirmSignUp(params).promise();
//Returning the redirect url
confirmSignUp.then(
        (data) => {
            context.succeed({
                location: process.env.POST_REGISTRATION_VERIFICATION_REDIRECT_URL
            });
        }
    ).catch(
        (error) => {
            callback(error.message)
        }
    )
};

Создайте приложение узла в IDE по вашему выбору, а затем выполните сборку с помощью npm install и после сборки вашего приложения. Создайте zip-архив (в корневой папке 5 файлов примерно в зависимости от вашей среды IDE) и загрузите его в свое лямбда-приложение.

Метод Lambda Handler должен быть = index.handler

Установите следующее в переменной lambda env

POST_REGISTRATION_VERIFICATION_REDIRECT_URL REGION

В своем приложении вы проверяете пользователя в своем пуле пользователей когнитивного анализа и возвращаете URL-адрес для перенаправления. Не в области действия: сценарий ошибки также можно обработать в соответствии с вашими требованиями.

Шаг 5: вернитесь к шлюзу API, создайте запрос GET и вставьте лямбда-функцию, которую вы должны создать на шаге 4, и обновите шаблон сопоставления.

введите описание изображения здесь  введите описание изображения здесь

Шаг 6: Теперь мы должны перенаправить запрос на основе вашего лямбда-ответа. В разделе «Ответ метода» на шлюзе API удалите 200, создайте 302 и добавьте местоположение заголовка ответа в соответствии с изображением,

введите описание изображения здесь А затем в ответе интеграции вам нужно удалить 200 и добавить 302, а затем добавить значение сопоставления заголовка как integration.response.body.location (Помните о регистре символов)  введите описание изображения здесь

Самый важный шаг: после завершения настройки. Разверните API и обновите константный URL API в лямбда-функции, созданной на шаге 1.

Попробуйте создать тестового пользователя, и у пользователя должна быть ссылка на электронную почту, например, https://xxxx-api.eu-west-2.amazonaws.com/xx/xx/xx/redirect?code=xx & username = xxxxx; clientId = xxxxx; регион [email protected]

person Jacob Joy    schedule 17.12.2019
comment
спасибо большое искал что то подобное. в любом случае, когда я открываю полученную ссылку из электронного письма, я получаю {message: Missing Authentication Token}. У тебя есть идеи, как это исправить? - person alexrogo; 10.02.2021
comment
Как создать приложение узла, указанное в шаге 4? - person Luis Garcia; 13.02.2021

Теперь вы можете вручную настроить лямбда-функцию перенаправления подтверждения при добавлении ресурса аутентификации в ваш проект: amplify add auth. Оцените

person Kouder    schedule 29.07.2020