web-dev-qa-db-fra.com

Groupe d'utilisateurs AWS Cognito sans mot de passe

Je souhaite utiliser un numéro de téléphone comme nom d'utilisateur pour mon application et je veux pouvoir simplifier l'inscription en vérifiant simplement le numéro de téléphone chaque fois qu'ils veulent se connecter - aucun mot de passe en mémoire ne se souvient des affaires. 

Comment faire cela avec AWS Cognito User Pool car il me demande de configurer obligatoirement un mot de passe pour chaque utilisateur.

J'ai pensé à utiliser un mot de passe factice pour chaque utilisateur et à configurer la vérification obligatoire de l'utilisateur. À chaque fois que l'utilisateur se déconnecte, je peux le "déverrouiller" afin que le prochain numéro lui demande automatiquement de vérifier le numéro de téléphone. De plus, je connecterais mon application à la "connexion" uniquement si l'utilisateur est vérifié. 

Faites-moi savoir si est la meilleure approche :( Je suis nouveau à AWS et je ne peux pas trouver d'articles pour ce scénario.

Merci !!

12
spar

AWS Cognito ne prenant actuellement pas en charge l'authentification sans mot de passe, vous devez mettre en œuvre une solution de contournement avec un mot de passe aléatoire stocké en externe. Vous pouvez implémenter le flux d'authentification comme suit.

  • Après l'inscription de l'utilisateur (demandez également le numéro de téléphone mobile et rendez-le obligatoire), stockez le numéro de téléphone mobile, le nom d'utilisateur et le mot de passe également dans Dynamodb crypté avec AWS KMS (pour une sécurité accrue).
  • Vous pouvez utiliser MFA avec un numéro de téléphone portable pour contester l’authentification. Ainsi, une fois que l’utilisateur a saisi un numéro de téléphone et appuyé sur login (dans le frontend), vous pouvez automatiquement rechercher le mot de passe correspondant au nom d’utilisateur (Passthrough) et déclencher l’envoi par MFA d’un code pour le téléphone mobile de l’utilisateur. et vérifiez que vous utilisez le kit AWS Cognito SDK (sans implémentation de message mobile personnalisé ni de défi).
  • Si vous envisagez d'implémenter le flux manuellement (sans MFA) pour envoyer le SMS & la validation, vous pouvez utiliser AWS SNS à cette fin.

Consultez l’exemple de code suivant pour comprendre l’intérêt de MFA et consultez ce lien pour plus de détails.

    var userData = { 
        Username : 'username',
        Pool : userPool
    };

    cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);

    var authenticationData = {
        Username : 'username',
        Password : 'password',
    };

    var authenticationDetails = new AWSCognito.CognitoIdentityServiceProvider.AuthenticationDetails(authenticationData);

    cognitoUser.authenticateUser(authenticationDetails, {
        onSuccess: function (result) {
            alert('authentication successful!')
        },

        onFailure: function(err) {
            alert(err);
        },

        mfaRequired: function(codeDeliveryDetails) {
            var verificationCode = Prompt('Please input verification code' ,'');
            cognitoUser.sendMFACode(verificationCode, this);
        }

    });

Remarque: ici, l'AMF avec numéro de téléphone portable n'est pas utilisé aux fins de l'AMF mais comme solution de contournement pour répondre à vos besoins.

12
Ashan

cela peut fonctionner, mais le stockage du mot de passe dans dynamoDB peut poser des problèmes de sécurité. à la place, nous pouvons essayer comme ceci:

option # 1: - inscription de l'utilisateur avec nom d'utilisateur et mot de passe.

  1. configurer les déclencheurs cognito - nous pouvons utiliser les fonctions lambda.
  2. A. Créer un défi d'authentification B. Définir le défi de l'authentification C. Vérifier la réponse au défi d'authentification
  3. l'application client doit implémenter le flux d'authentification CUSTOM_CHALLENGE.
  4. demander à l'utilisateur d'entrer le numéro de téléphone enregistré, le transmettre dans le champ Nom d'utilisateur. le déclencheur B comprendra la demande et transmettra le flux au déclencheur A, le déclencheur A générera un code aléatoire 5. utilisez le service AWS SNS pour envoyer SMS au numéro de téléphone de l'utilisateur.
  5. Le déclencheur C validera OTP et permettra aux points de connexion à prendre en compte: A. configurer le numéro de téléphone comme alias (cochez la case Autoriser également la connexion avec un numéro de téléphone vérifié) b. rendre le champ de numéro de téléphone comme vérifiable (ceci permet à l'utilisateur de recevoir le mot de passe à usage personnel)

option # 1: - inscription de l'utilisateur sans nom d'utilisateur ni mot de passe. configuration cognito

  1. configurer le numéro de téléphone comme alias (sélectionnez Autoriser également la connexion avec un numéro de téléphone vérifié)
  2. rendre le champ de numéro de téléphone comme vérifiable (ceci permet à l'utilisateur de recevoir le mot de passe à usage personnel)
  3. lors de l'inscription, ne demandez pas à l'utilisateur de fournir son nom d'utilisateur et son mot de passe, demandez simplement son numéro de téléphone
  4. générer un UUID pour que le nom d'utilisateur et le mot de passe soient uniques et les transmettre à cognito avec le numéro de téléphone
  5. Cognito envoie le code OTP à l'utilisateur pour confirmation du compte.
  6. pour le numéro de téléphone avec les déclencheurs de configuration de connexion OTP comme expliqué dans l’option ci-dessus.

pour le code des déclencheurs, voir aws cognito pool avec plusieurs options de connexion

1
suryan

Il s’agit d’un tournant légèrement différent de ce que le PO demande, car il utilise un seul secret, mais je pense que cela pourrait aider les autres qui atterrissent sur cette question.

Pour ce faire, j'ai créé des lambda personnalisés pour les déclencheurs de Cognito: définir le défi d’authentification, créer un défi d’authentification et vérifier le défi d’authentification.

Mon souhait était que mon serveur utilise une secret pour ensuite obtenir des jetons d'accès et d'actualisation pour tout utilisateur de Cognito.

Define Auth Challenge Lambda

exports.handler = async event => {
  if (
    event.request.session &&
    event.request.session.length >= 3 &&
    event.request.session.slice(-1)[0].challengeResult === false
  ) {
    // The user provided a wrong answer 3 times; fail auth
    event.response.issueTokens = false;
    event.response.failAuthentication = true;
  } else if (
    event.request.session &&
    event.request.session.length &&
    event.request.session.slice(-1)[0].challengeResult === true
  ) {
    // The user provided the right answer; succeed auth
    event.response.issueTokens = true;
    event.response.failAuthentication = false;
  } else {
    // The user did not provide a correct answer yet; present challenge
    event.response.issueTokens = false;
    event.response.failAuthentication = false;
    event.response.challengeName = 'CUSTOM_CHALLENGE';
  }
  return event;
};

Create Auth Challenge Lambda

exports.handler = async event => {
  if (event.request.challengeName == 'CUSTOM_CHALLENGE') {
    // The value set for publicChallengeParameters is arbitrary for our
    // purposes, but something must be set
    event.response.publicChallengeParameters = { foo: 'bar' };
  }
  return event;
};

Verify Auth Challenge Lambda

exports.handler = async event => {
  if (event.request.challengeName == 'CUSTOM_CHALLENGE') {
    // The value set for publicChallengeParameters is arbitrary for our
    // purposes, but something must be set
    event.response.publicChallengeParameters = { foo: 'bar' };
  }
  return event;
};

J'ai alors pu utiliser certains JS, en utilisant Amazon-cognito-identity-js , pour fournir le secret et obtenir les jetons:

var authenticationData = {
  Username : 'username'
};
var authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(authenticationData);
var poolData = {
  UserPoolId : '...', // Your user pool id here
  ClientId : '...' // Your client id here
};
var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
var userData = {
  Username : 'username',
  Pool : userPool
};
var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);

cognitoUser.setAuthenticationFlowType('CUSTOM_AUTH');

cognitoUser.initiateAuth(authenticationDetails, {
  onSuccess: function(result) {
    // User authentication was successful
  },
  onFailure: function(err) {
    // User authentication was not successful
  },
  customChallenge: function(challengeParameters) {
    // User authentication depends on challenge response
    var challengeResponses = 'secret'
    cognitoUser.sendCustomChallengeAnswer(challengeResponses, this);
  }
});
0
redgeoff