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