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

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.
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)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, RefreshTokenToken yang dikembalikan adalah JWT berstruktur standar (header.payload.signature):
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.
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.
Alur produksi yang kini sepenuhnya lokal:
Setiap panah di atas terjadi terhadap container floci di localhost — iterasi bug auth (token expired, claim kurang, group salah) kini berdetak detik, bukan menit.
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 wrapperPoin 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.
Rangkuman episode ini:
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!