Dans AWS Cognito, vous pouvez ajouter un utilisateur à un groupe (après avoir créé un groupe pour la première fois). Un utilisateur peut appartenir à un ou plusieurs groupes.

Avec l'utilisation du SDK JavaScript (https://github.com/aws/amazon-cognito- identity-js), existe-t-il un moyen de lire les groupes attribués? Est-ce que aws-sdk fournirait un accès via amazon-cognito-identity-js?

27
user1322092 24 janv. 2017 à 15:34

7 réponses

Meilleure réponse

Si vous avez simplement besoin des groupes d'utilisateurs Cognito dont l'utilisateur authentifié est membre, au lieu de passer un appel API distinct, ces données sont codées dans l'idToken.jwtToken que vous avez reçu lors de l'authentification.

Ceci est utile pour les décisions de rendu / d'accès côté client dans angular / react / etc. applications.

Consultez la revendication de tableau "cognito: groups" dans cet exemple décodé idToken.jwtToken:

{
  "sub": "a18626f5-a011-454a-b4c2-6969b3155c24",
  "cognito:groups": [
    "uw-app-administrator",
    "uw-app-user"
  ],
  "email_verified": true,
  "iss": "https://cognito-idp.<region>.amazonaws.com/<user-pool-id>",
  "cognito:username": "<my-user-name>",
  "given_name": "<my-first-name>",
  "aud": "<audience-code>",
  "token_use": "id",
  "auth_time": 1493918449,
  "nickname": "Bubbles",
  "exp": 1493922049,
  "iat": 1493918449,
  "email": "<my-email>"
}

J'espère que cela t'aides.

39
bfieber 4 mai 2017 à 17:29

Si vous utilisez Amplify, si vous utilisez la méthode currentAuthenticatedUser , vous pouvez obtenir les groupes à partir de la réponse en utilisant:

response.signInUserSession.idToken.payload['cognito:groups']

Ou en utilisant la méthode currentSession , vous pouvez utiliser l'une des méthodes suivantes:

response.accessToken.payload['cognito:groups']

Ou

response.idToken.payload['cognito:groups']
4
William Alagaratnam 22 nov. 2018 à 22:09

Vous pouvez désormais obtenir facilement les groupes d'utilisateurs à partir de la session utilisateur:

session.getIdToken().decodePayload();

Celui-ci contient un tableau de groupes dans la clé cognito:groups renvoyée

1
bwobbones 28 nov. 2017 à 07:38

Cette API existe - AdminListGroupsForUser. La raison pour laquelle vous ne le voyez pas est, comme son nom l'indique, que l'API n'est actuellement disponible que sur une base administrative. Cognito n'inclut pas les API d'administration dans les SDK mobiles. Il serait inclus dans les kits SDK AWS / SDK côté serveur, mais il convient de noter que cette API nécessite des informations d'identification de développeur, comme toutes les API d'administration.

6
Jeff Bailey 24 janv. 2017 à 19:25

À l'origine, je m'attendais à ce que l'API JavaScript Cognito fournisse une propriété ou une méthode simple pour renvoyer la liste des groupes, mais j'ai plutôt conclu qu'elle était enfouie dans un jeton et que je devais donc en savoir plus sur jwt. Une fois que l'utilisateur Cognito est établi et que la session est récupérée, le tableau de groupes est disponible dans l'IdToken.

var jwtDecode = require('jwt-decode');
var AmazonCognitoIdentity = require('amazon-cognito-identity-js');
var CognitoUserPool = AmazonCognitoIdentity.CognitoUserPool;
var CognitoUser = AmazonCognitoIdentity.CognitoUser;

var userPool = new CognitoUserPool({UserPoolId:'', ClientId:''");
...
app.get('/app', function(req, res){
    var cognitoUser = userPool.getCurrentUser();
    if(cognitoUser != null){
        cognitoUser.getSession(function(err, session) {
            if (err) {
                console.error(err);
                return;
            }
            console.log('session validity: ' + session.isValid());

            var sessionIdInfo = jwtDecode(session.getIdToken().jwtToken);
            console.log(sessionIdInfo['cognito:groups']);
        });
    }
});
15
jspeaks 27 juin 2017 à 12:15

Si vous voulez lister des groupes pour un utilisateur spécifique dans le backend et les renvoyer en tant qu'API, voici un exemple complet utilisant le sdk aws de golang:

func sessionWithRegion(region *string) *session.Session {
    sess := Session.Copy()
    if v := aws.StringValue(sess.Config.Region); len(v) == 0 {
        sess.Config.Region = region
    }

    return sess
}

func getGroupsForUser(region, userPoolId, userName *string, limit int64, nextToken ...*string) (*cognitoidentityprovider.AdminListGroupsForUserOutput, error) {
    sess := sessionWithRegion(region)
    svc := cognitoidentityprovider.New(sess)

    input := &cognitoidentityprovider.AdminListGroupsForUserInput{
        UserPoolId: userPoolId,
        Username:   userName,
        Limit:      &limit,
    }

    if nextToken != nil && len(nextToken) > 0 {
        input.NextToken = nextToken[0]
    }

    return svc.AdminListGroupsForUser(input)

}

nextToken est utilisé pour prendre en charge la pagination pour charger plus de groupes au cas où nous aurions encore des utilisateurs à revenir de cognito pour retourner / récupérer, en d'autres termes, pour récupérer la page suivante. voici un exemple simple de l'apparence de vos appels

func listGroups(pageNo *string) ([]*cognitoidentityprovider.GroupType, *string, error) {

    page, err := getGroupsForUser(aws.String("us-east-1"), aws.String("xxx"), aws.String("myuserName"), 60, map[bool]*string{true: pageNo, false: nil}[pageNo != nil])
    if err != nil {
        return nil, nil, err
    }
    return page.Groups, page.NextToken, nil
}

Les extraits de code ci-dessus étaient simplement destinés à vous permettre, à vous et aux autres collègues de la communauté, de comprendre facilement l'idée et comment l'implémenter, mais cela peut nécessiter quelques ajustements. N'hésitez pas à laisser un commentaire au cas où vous auriez besoin de plus d'aide.

0
Muhammad Soliman 24 févr. 2020 à 21:42

Vous n'avez rien à décoder, les données sont déjà disponibles sur session.getIdToken().payload['cognito:groups']

1
LiriB 23 févr. 2018 à 22:58