web-dev-qa-db-fra.com

Comment rediriger après avoir confirmé Amazon cognito en utilisant l'URL de confirmation?

Je souhaite rediriger vers une URL spécifique après la confirmation de l'utilisateur dans Amazon cognito.

Lorsqu'un utilisateur s'inscrit, il recevra un e-mail de confirmation avec un lien de vérification comme suit https: // <> .auth.us-west-2.amazoncognito.com/confirmUser? Client_id = << >> & user_name = < <>> & confirmation_code = << >>

Si l'utilisateur clique sur le lien ci-dessus, il sera redirigé vers la page de confirmation.

Une fois la confirmation de l'utilisateur terminée, la page doit être redirigée vers mon application.

Veuillez me donner une idée pour résoudre ce problème.

19
Richardson. M

Actuellement, cette redirection ne peut pas être effectuée à l'aide du lien de vérification dans l'e-mail. J'ai essayé d'ajouter redirect_uri à l'URL de vérification il y a quelque temps, mais cela ne fonctionne pas.

Solution

Je sais que c'est une solution de contournement pour une exigence aussi simple. La meilleure façon serait de soulever une demande de fonctionnalité et d'espérer qu'ils prennent en charge une redirect_uri dans l'URL Cognito.

[~ # ~] modifier [~ # ~]

Pour économiser vos coûts lambda, vous pouvez également utiliser un point de terminaison HTTP dans votre API et faire une demande au point de terminaison du service cognito pour votre région. Exemple:

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"
}
15
agent420

Oui, nous marquerons cela comme une demande de fonctionnalité. Cependant, nous ne pouvons pas estimer le délai de livraison à ce stade.

3
crystalwang

J'ai réussi à travailler avec l'aide de la réponse ci-dessus de @ agent420 et en examinant le problème github https://github.com/aws-amplify/amplify-js/issues/612

Voici donc le processus complet que j'ai suivi.

  • Nous devons d'abord changer la méthode de vérification pour coder à partir du lien car nous devons saisir le code lors de la confirmation de l'utilisateur via lambda. Pour ce faire, dans Cognito (AWS Console), accédez à Personnalisations des messages -> Type de vérification, changez-le en 'Code'.
  • Ensuite, nous ajouterons un déclencheur lambda à déclencher avant d'envoyer la vérification par e-mail. Pour ajouter un lambda pour cela, accédez à Lambda (AWS Console) et créez une fonction. Ci-dessous est le lambda que j'ai utilisé.
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);
};

Votre e-mail vous sera envoyé avec l'objet et le message spécifiés dans event.response.emailSubject et event.response.emailMessage. L'utilisateur sera dirigé vers l'URL spécifiée dans la variable url.

  • Pour ajouter le déclencheur Allez à, Cognito (Aws-console) Déclencheurs -> Message personnalisé et sélectionnez le lambda que vous venez de créer.
  • Puisque l'utilisateur dirigera vers notre URL, nous pouvons contrôler la demande, confirmer l'utilisateur et rediriger vers l'URL de votre choix.

J'ai utilisé un lambda pour cela avec l'utilisation d'AWS APIGateway. Ci-dessous est le code que j'ai écrit dans nodejs où j'ai utilisé une redirection 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)
    }
  )
}

Remplacer les variables d'environnement REGION et POST_REGISTRATION_VERIFICATION_REDIRECT_URL avec les valeurs de la vôtre selon l'exigence.

1
Yasith Prabuddhaka