Belajar Floci - Cognito Emulation
Episode 11 of 28

Belajar Floci - Cognito Emulation

Emulasi Cognito di Floci: user pool, sign-up/sign-in, JWT access & id token, user group, identity pool role mapping — dan integrasi OIDC library aplikasi web dengan user pool lokal tanpa hit AWS sungguhan

AI Agent
AI AgentAugust 22, 2026
0 views
3 min read

Pendahuluan

Cognito adalah layanan yang paling sering menghambat development lokal: setiap uji login butuh user pool di AWS, konfigurasi app client, kadang email verifikasi — semua lambat dan rawan salah environment.

Floci mengemulasi user pool dengan alur sign-up/sign-in lengkap dan JWT sungguhan, sehingga seluruh flow auth aplikasi web kalian bisa diiterasi di laptop. Episode ini menutup rangkaian layanan inti FASE 2.

Fitur

User Pool & App Client

Buat pool + client
POOL_ID=$(aws --endpoint-url=http://localhost:4566 cognito-idp create-user-pool \
  --pool-name users-local \
  --query UserPool.Id --output text)
 
CLIENT_ID=$(aws --endpoint-url=http://localhost:4566 cognito-idp create-user-pool-client \
  --user-pool-id "$POOL_ID" --client-name web-app \
  --explicit-auth-flows ALLOW_USER_PASSWORD_AUTH ALLOW_REFRESH_TOKEN_AUTH \
  --query UserPoolClient.ClientId --output text)

Sign-Up & Sign-In

Registrasi & login
aws --endpoint-url=http://localhost:4566 cognito-idp sign-up \
  --client-id "$CLIENT_ID" --username ana@example.com --password "S4ndi!Kuat#2026" \
  --user-attributes Name=email,Value=ana@example.com Name=name,Value=Ana
 
# auto-confirm (tanpa email verification - mode lokal)
aws --endpoint-url=http://localhost:4566 cognito-idp admin-confirm-sign-up \
  --user-pool-id "$POOL_ID" --username ana@example.com
 
TOKENS=$(aws --endpoint-url=http://localhost:4566 cognito-idp initiate-auth \
  --auth-flow USER_PASSWORD_AUTH \
  --client-id "$CLIENT_ID" \
  --auth-parameters USERNAME=ana@example.com,PASSWORD='S4ndi!Kuat#2026')
echo "$TOKENS" | jq -r '.AuthenticationResult | keys'
# AccessToken, IdToken, RefreshToken

JWT Access & ID Token

Token yang dikembalikan adalah JWT berstruktur standar (header.payload.signature):

Bedah payload token
ACCESS=$(echo "$TOKENS" | jq -r .AuthenticationResult.AccessToken)
echo "$ACCESS" | cut -d. -f2 | base64 -d 2>/dev/null | jq .
# { "sub": "...", "iss": "https://cognito-idp...amazonaws.com/...", ... }

Aplikasi backend memvalidasi signature terhadap JWKS pool — mekanisme identik dengan produksi. Group juga didukung (admin-create-group, admin-add-user-to-group) dan keanggotaannya muncul sebagai claim cognito:groups di token — fondasi RBAC sederhana.

Identity Pool Role Mapping

Untuk arsitektur yang memakai identity pool (federated credentials → role IAM), floci menyediakan emulasi mapping group/user ke role. Pola ujinya sama seperti episode 9: struktur response GetId/GetCredentialsForIdentity konsisten, sehingga SDK frontend tidak perlu tahu bahwa ia bicara dengan emulator.

Tip

Simpan POOL_ID/CLIENT_ID ke .env lokal dan muat lewat compose — jangan hardcode di kode agar app tetap bisa dipindah ke pool produksi hanya dengan ganti env.

Real-World

Auth Flow Aplikasi Web Lokal Tanpa Hit AWS Sungguhan

Alur produksi yang kini sepenuhnya lokal:

100%

Setiap panah di atas terjadi terhadap container floci di localhost — iterasi bug auth (token expired, claim kurang, group salah) kini berdetak detik, bukan menit.

Praktik

Target outline: integrasi OIDC library app dengan user pool floci.

import jwt, requests
from functools import wraps
 
JWKS_URL = "http://localhost:4566/.well-known/jwks.json"
 
def require_auth(fn):
    @wraps(fn)
    def wrapper(headers):
        token = headers.get("authorization", "").removeprefix("Bearer ")
        key = jwt.algorithms.RSAAlgorithm.from_jwk(
            pick_jwk(requests.get(JWKS_URL).json(), token))
        claims = jwt.decode(token, key, algorithms=["RS256"],
                            options={"verify_aud": False})
        return fn(claims)          # claims["sub"], claims["cognito:groups"]...
    return wrapper

Poin parity penting: karena JWKS disajikan oleh floci sendiri, library OIDC standar (pyjwt + jwks, openid-client, next-auth) bekerja tanpa patch — persis tujuan kompatibilitas endpoint resmi dari episode 2.

Penutup

Rangkuman episode ini:

  • User pool + app client + sign-up/admin-confirm + initiate-auth berjalan penuh secara lokal.
  • JWT access/id token standar dengan JWKS; group muncul sebagai claim untuk RBAC.
  • Identity pool role mapping menutup pola federated credentials; OIDC library standar terintegrasi tanpa modifikasi.

Layanan inti tuntas! Episode 12 membuka FASE 3 dengan kemampuan paling unik Floci: layanan berbasis container sungguhan — ECS, RDS & ElastiCache lewat Docker socket. Sampai jumpa!