web-dev-qa-db-fra.com

AWS Cognito - AdminInitiateAuth vs InitiateAuth

Nous cherchons à tirer parti d'AWS Cognito pour l'authentification avec une architecture qui ressemble à: client (browser) -> our server -> AWS Cognito

Avec diverses configurations définies, initiateAuth ne semble pas différent de AdminInitiateAuth et j'aimerais donc comprendre quand sous ces configurations s'il est important de choisir l'une plutôt que l'autre.

Il semble que lorsque je crée une application avec un client secret et utilisez initiateAuth, il semble que ce soit presque la même expérience d'intégration que adminInitiateAuth qui utilise le ADMIN_NO_SRP_AUTH flux d'authentification. Ce dernier ne nécessite même pas d'informations d'identification AWS comme indiqué dans la documentation AWS. Mon intégration avec Cognito est la suivante:

initierAuth:

  const payload = {
    AuthFlow: "USER_PASSWORD_AUTH",
    ClientId: cognitoClientId,
    AuthParameters: {
      USERNAME: username,
      PASSWORD: password,
      SECRET_HASH: generateSignature(username)
    }
  }
  const response = await cognitoClient.initiateAuth(payload).promise();

adminInitiateAuth:

  const payload = { 
    UserPoolId: userPoolId,
    AuthFlow: "ADMIN_NO_SRP_AUTH",
    ClientId: cognitoClientId,
    AuthParameters: {
      USERNAME: username,
      PASSWORD: password,
      SECRET_HASH: generateSignature(username)
    }
  }
  const response = await cognitoClient.adminInitiateAuth(payload).promise();

Vous pouvez voir la différence entre les différentes valeurs de AuthFlow, appelant différentes méthodes et ADMIN_NO_SRP_AUTH nécessitant le paramètre UserPoolId qui me semble superficiel.

Nous générons également la signature basée sur le secret client, quelque chose que nous traiterions en toute sécurité.

8
n00b

Moi aussi, j'ai passé pas mal de temps à rechercher de la documentation rare sur le moment d'utiliser AdminInitiateAuth vs InitiateAuth.

https://docs.aws.Amazon.com/cognito/latest/developerguide/Amazon-cognito-user-pools-authentication-flow.html est censé aider, mais je le trouve mal structuré et Très perturbant.

D'après ma compréhension, vous avez raison, vous pouvez utiliser les deux approches sur le serveur:

  1. InitiateAuth avec AuthFlow=USER_PASSWORD_AUTH (nécessite que le client d'application soit créé avec le secret client).
  2. AdminInitiateAuth avec AuthFlow=ADMIN_USER_PASSWORD_AUTH (remplacé l'héritage ADMIN_NO_SRP_AUTH)

Je pense que la deuxième option est plus logique pour le scénario d'utilisation du serveur. De cette façon, vous pouvez désactiver ALLOW_USER_PASSWORD_AUTH flux d'authentification dans les paramètres du client d'application. Bien que ce ne soit probablement pas un risque énorme, il semble plus propre de ne pas avoir InitiateAuth API ouverte au public car elle n'est pas requise.

1
Max Ivanov