🚀 Desplegar AWS Cognito 🔑 y una Aplicación Cliente Con Terraform.

En una entrada anterior contaba un poco sobre que es AWS Cognito Link, he estado realizando muchas pruebas con nuevas funcionalidades e identificando las posibilidades que tenemos para integrarla con nuestras aplicaciones.

He decidido armar una serie de artículos con distintas configuraciones e integraciones para entender en profundidad este servicio de AWS, y como siempre es mejor empezar por el principio.

Vamos a Desplegar AWS Cognito + una aplicación Cliente utilizando Terraform, Aquí Link dejaré el repositorio con el código, recuerda cambiar el nombre de los buckets y las aplicaciones.

Estructura del repositorio:

https://github.com/olcortesb/cognito-terraform

  • cognito.tf – Main Cognito resources configuration

  • config.tf – Terraform backend configuration

  • variables.tf – Input variables definition

  • maint.tf – AWS provider configuration

  • terraform.tfvars – Variable values for deployment

El “User pool”

Para definir el user pool utilizamos el recurso "aws_cognito_user_pool" de Terraform, importante definir los atributos del usuario (recordar que Cognito tiene unos atributos predefinidos) y los atributos custom que se configura con un esquema más, tenemos hasta 50 atributos custom para agregar. Ref

# 1. User Pool
resource "aws_cognito_user_pool" "this" {
  name                     = "olcb-community-user-pool"
  username_attributes      = ["email"]
  auto_verified_attributes = ["email"]

  admin_create_user_config {
    allow_admin_create_user_only = false
  }
  # Configuraciones del password
  password_policy {
    minimum_length    = 8
    require_lowercase = true
    require_uppercase = true
    require_numbers   = true
    require_symbols   = false
  }
  # habilitar attributo predefinido  
  schema {
    name                = "email"
    attribute_data_type = "String"
    required            = true
    mutable             = true
  }
  # Atrributo custom
  schema {
    name                = "custom_attr"
    attribute_data_type = "Number"
    required            = false
    mutable             = true
    number_attribute_constraints {
      min_value = 1
      max_value = 100
    }
  }
}

Esta parte del código crea nuestro User Pool

Una vez configurado el User Pool necesitamos crear una aplicación Cliente que Sirva de integración con las aplicaciones externas que se conectaran a través de Cognito.

La “App Cliente”

La aplicación cliente la desplegamos utilizando el recurso "aws_cognito_user_pool_client", los parámetros más importantes son la referencia al User Pool que creamos en el paso anterior, user_pool_id, los flujos que aceptaremos allowed_auth_flows y el proveedor de los que tengamos en Cognito que soportará esta aplicación supported_identity_providers

# 2. App Client
resource "aws_cognito_user_pool_client" "this" {
  name                                 = "olcb-app-client"
  user_pool_id                         = aws_cognito_user_pool.this.id
  generate_secret                      = false
  allowed_oauth_flows_user_pool_client = true
  allowed_oauth_flows                  = ["code", "implicit"]
  allowed_oauth_scopes                 = ["email", "openid", "profile"]
  explicit_auth_flows                  = ["ADMIN_NO_SRP_AUTH", "USER_PASSWORD_AUTH"]
  callback_urls                        = ["https://example.com/callback"]
  logout_urls                          = ["https://example.com/logout"]

  supported_identity_providers = ["COGNITO"]
  refresh_token_validity       = 30
}

Este recurso generará la aplicación dentro de nuestro Cognito user pool

El “User Pool Domain”

Finalmente, asignamos un dominio para que nuestras URLs de login y alta de usuarios y LogOut:

# 3. User Pool Domain
resource "aws_cognito_user_pool_domain" "this" {
  domain       = "olcb-app-domain"
  user_pool_id = aws_cognito_user_pool.this.id
}

En el apartado domain de nuestro Cognito User Pool tendremos la URI que hemos definido en el Terraform.

Pantalla de Login

Finalmente, tendremos operativo nuestro Cognito con un login “UI Clásico”, y el dominio que hemos configurado.

En siguientes entrada mostraré como es el circuito de alta de usuario, conexión desde una app en Python y varias características más,

gracias por leer, Saludos

Referencias

0
Subscribe to my newsletter

Read articles from Oscar Cortes Bracho directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Oscar Cortes Bracho
Oscar Cortes Bracho

Cloud Software Engineer