29 Jul
29Jul

O AWS Cognito possui uma interface simples e poderosa que nos permite criar pool de usuários com facilidade e uma API rica para autenticar usuários e gerenciar este pool e suas integrações configurações. Mas o Cognito também fornece uma interface web padrão para autenticação, dispensando o esforço de desenvolvimento de uma página de login. 



É possível customizar cores e logo e a URL de redirecionamento em caso de sucesso. Isto permite a utilização deste login em qualquer aplicação web que necessite da autenticação do Cognito.


O exemplo abaixo demonstra como montar a URL de autenticação: 

GET https://mydomain.auth.us-east-1.amazoncognito.com/login?
response_type=code&
client_id=ad398u21ijw3s9w3939&
redirect_uri=https://YOUR_APP/redirect_uri&
state=STATE&
scope=openid+profile+aws.cognito.signin.user.admin


Os parâmetros de dominio, app name, client_id e escopo podem ser obtidos na console do Cognito, exemplo: 



A opção UI customization permite ajustar o logo e alguns parâmetros de CSS. 


Utilizando a API diretamente

Uma outra opção, para quem necessita criar uma página de login customizada, ou mesmo um login para aplicações mobile é utilizar a API do Cognito. Cabe lembrar que uma vez o usuário criado na base do Cognito ele deve modificar a senha cadastrada inicialmente.  O código abaixo demonstra como realizar o login no Cognito utilizando a API.


var config = require('./config.json');
var AWS = require('aws-sdk');
var AWSCognito = require('amazon-cognito-identity-js-node');

AWS.CognitoIdentityServiceProvider.AuthenticationDetails = AWSCognito.AuthenticationDetails;
AWS.CognitoIdentityServiceProvider.CognitoUserPool = AWSCognito.CognitoUserPool;
AWS.CognitoIdentityServiceProvider.CognitoUser = AWSCognito.CognitoUser;

function handler (event, context, cb)
{
    // Se o ClientId recebido pela função for diferente do ClientID criado para a APP, retornar 403
    if (event.clientId != YOUR_CLIENTEID) {
        cb(403);
        return;
    }

    var authenticationData = {
        Username : 'username',
        Password : 'password'
    };
    
    authenticationData.Username = YOUR_USERNAME;
    authenticationData.Password = event.action == "CHANGE" ? event.newPassword : YOUR_USER_PASSWORD;

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

    var cognitoUser = new AWS.CognitoIdentityServiceProvider.CognitoUser(userData);

    cognitoUser.authenticateUser(authenticationDetails, {
        onSuccess: function (result) {
            console.log('access token ' + result.getAccessToken().getJwtToken());
            
            var key = 'cognito-idp.us-east-1.amazonaws.com/' + YOUR_USER_POOL_ID;

            AWS.config.credentials = new AWS.CognitoIdentityCredentials({
                IdentityPoolId : YOUR_USER_POOL_ID, // your identity pool id here
                Logins : {
                    // Change the key below according to the specific region your user pool is in.
                   [key]: result.getIdToken().getJwtToken()
                }
            });
            
            console.log("cognitoUser: " + JSON.stringify(cognitoUser));
            console.log("Config     : " + JSON.stringify(AWS.config));
            console.log("Credentials: " + JSON.stringify(AWS.config.credentials));
            
            cb(null, {
                accessToken: result.getAccessToken().getJwtToken(), 
                idToken: result.getIdToken().getJwtToken()
            });
             
        },

        onFailure: function(err) {
            console.log(JSON.stringify(err));
            
            cb(err);
        },
        
        newPasswordRequired: function(userAttributes, requiredAttributes) {
                        
             event.action = "TEST";
            
             cognitoUser.completeNewPasswordChallenge(event.newPassword, {}, this);

         }

    });    
};
  
exports.handler = handler


Resumo

Para mais informações sobre o uso do Cognito para gestão de pool de usuários e autenticação visite a página da AWS https://docs.aws.amazon.com/cognito/latest/developerguide/login-endpoint.html


Comentários
* O e-mail não será publicado no site.
ESTE SITE FOI CRIADO USANDO