From e49f270a0e7efc9e845da40596d09b1c287a6ead Mon Sep 17 00:00:00 2001 From: donghyeon-ka Date: Sat, 25 Jul 2026 16:39:31 +0900 Subject: [PATCH] docs: define AP1 local identity profile --- docs/internal-spa-direct-no-google.md | 17 +++++++++++++++++ .../verify-internal-spa-no-google-contract.sh | 13 +++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 docs/internal-spa-direct-no-google.md create mode 100755 scripts/verify-internal-spa-no-google-contract.sh diff --git a/docs/internal-spa-direct-no-google.md b/docs/internal-spa-direct-no-google.md new file mode 100644 index 0000000..4cff81a --- /dev/null +++ b/docs/internal-spa-direct-no-google.md @@ -0,0 +1,17 @@ +# AP1 internal SPA direct: local identity profile + +```text +Browser SPA --Authorization Code + PKCE--> Keycloak +Browser SPA --Bearer access token-------> Spring Resource Server +``` + +이 profile은 Keycloak 로컬 사용자만으로 동작한다. Google client ID/secret, +public domain, broker callback이 없어도 AP1의 login, refresh, logout, +audience/issuer 검증과 RBAC를 모두 학습할 수 있다. + +`mock-google` provider가 realm에 함께 존재해도 로컬 로그인은 provider +availability에 의존하지 않는다. 실제로 federation 없는 배포를 만들 때는 +해당 IdP를 disabled로 두거나 realm overlay에서 제거한다. + +빠른 계약 검증은 `verify-internal-spa-no-google-contract.sh`, 실제 브라우저 +흐름은 `verify-pattern1.sh`가 담당한다. diff --git a/scripts/verify-internal-spa-no-google-contract.sh b/scripts/verify-internal-spa-no-google-contract.sh new file mode 100755 index 0000000..0bb8c9a --- /dev/null +++ b/scripts/verify-internal-spa-no-google-contract.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env sh +set -eu + +jq -e ' + (.clients[] | select(.clientId == "spa-public") + | .publicClient == true + and .attributes["pkce.code.challenge.method"] == "S256") + and + ([.users[].username] | index("regular-user") != null) +' keycloak/import/keycloak-patterns-realm.json >/dev/null + +npm --prefix frontend test +echo "AP1 local-identity profile verified without a Google dependency"