web-dev-qa-db-fra.com

Comment utiliser le code renvoyé par Cognito pour obtenir les informations d'identification AWS?

En ce moment, j'ai du mal à comprendre AWS Cognito, alors peut-être que quelqu'un pourrait m'aider. J'ai défini un domaine pour servir l'interface utilisateur hébergée de Cognito pour mon groupe d'utilisateurs, comme ce qui est décrit ici . Alors quand je vais à https://<my-domain>.auth.us-east-1.amazoncognito.com/login?response_type=code&client_id=<MY_POOL_CLIENT_ID>&redirect_uri=https://localhost:8080 J'obtiens une page de connexion où mes utilisateurs peuvent se connecter à mon application avec Google. Cette partie fonctionne très bien.

Je ne sais pas quoi faire du code renvoyé depuis cette page une fois que mon utilisateur se connecte. Donc, une fois que je suis redirigé vers Google et autorise l'application à afficher mes informations, je suis redirigé vers l'une de mes URL avec un code dans les paramètres de requête. En ce moment, je redirige vers localhost, donc l'URL de redirection ressemble à ceci:

https://localhost:8080/?code=XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX

Quel est exactement ce code? De plus, comment puis-je l'utiliser pour accéder aux ressources AWS pour mon utilisateur?

15
arjabbar

vous pouvez trouver le "Authorization code grant" dans le doc: http://docs.aws.Amazon.com/cognito/latest/developerguide/cognito-user-pools-app-idp-settings.html =

3
Summer Guo

Pour récupérer les informations d'identification AWS (id_token, access_token et refresh_token) à partir du paramètre de demande de code renvoyé par le flux de code d'autorisation oath2, vous devez utiliser votre domaine Web Cognito User Pool /oauth2/token endpoint, en suivant https://docs.aws.Amazon.com/cognito/latest/developerguide/token-endpoint.html instructions.

Faites attention aux instructions d'utilisateur et de mot de passe de l'autorisation de base HTTP, il doit s'agir de votre application Cognito client_id et client_secret, sinon, vous obtenez un invalid_client Erreur.

Le flux de code est censé être utilisé côté serveur, car vous évitez les jetons flottant sur les URL. Si vous prévoyez de faire cela côté client, vous devez utiliser le response_type=token, car il donne ce résultat directement sur la redirection de connexion.

7

Je ne sais pas si cela va être utile dans 10 mois depuis la demande, mais cela pourrait être utile à d'autres.

J'ai utilisé response_type=token (Oauth flow = implicit grant & scope = openid) & provider as Cognito. Après vous être connecté à l'aide de la page de connexion par défaut, vous obtiendrez un id_token & access_token. Vous pouvez obtenir une identité temporaire pour votre utilisateur en utilisant ce id_token. Pour cela, vous devez également disposer d'une configuration de pool d'identités fédérées, avec des rôles attribués aux utilisateurs authentifiés et non authentifiés, et liés au pool d'utilisateurs avec lequel vous vous authentifiez. Une fois que vous avez cela (en supposant que vous utilisez javascript), vous pouvez suivre l'exemple sur exemples javascript de pools d'utilisateurs Cognito . Mon exemple de code dérivé du même -

function getAccessToken(idToken, identityPoolId, userPool) {
        let provider = "cognito-idp.us-east-2.amazonaws.com/" + userPool;
        let login = {};

        login[provider] = idToken;

        // Add the User's Id Token to the Cognito credentials login map.
        let credentials = new AWS.CognitoIdentityCredentials({
            IdentityPoolId: identityPoolId,
            Logins: login
        });

        //call refresh method in order to authenticate user and get new temp credentials
        credentials.get((error) => {
            if (error) {
                console.error(error);

                let response = {
                    statusCode: 500,
                    body: JSON.stringify(error)
                };

                return response;

            } else {
                console.log('Successfully logged!');
                console.log('AKI:'+ credentials.accessKeyId);
                console.log('AKS:'+ credentials.secretAccessKey);
                console.log('token:' + credentials.sessionToken);

                let response = {
                    statusCode: 200,
                    body: JSON.stringify({
                        'AKI': credentials.accessKeyId,
                        'AKS': credentials.secretAccessKey,
                        'token': credentials.sessionToken
                    })
                };

                return response;
            }
        });
    }

J'espère que cela t'aides.

4
ASR