GitHub: https://github.com/geekchow/micro-service-auth对本 PoC 中五个关键交互的端到端讲解展示Keycloak、Kong、OPA与banking-api-service在每个请求上如何协作。流程 1演示用户初始化在任何登录之前你先运行一次演示脚本。它调用identity-bootstrap-service由后者在Keycloak中创建可重复的演示用户。步骤演示脚本调用identity-bootstrap-service的POST /demo/users。identity-bootstrap-service用管理员凭据向Keycloak认证。identity-bootstrap-service创建或对齐reconcile演示用户。它为用户分配角色customer或ops-admin以及自定义声明例如account_ids。Keycloak确认用户就绪identity-bootstrap-service返回201。Keycloakidentity-bootstrap-serviceDemo ScriptKeycloakidentity-bootstrap-serviceDemo ScriptPOST /demo/usersAdmin token requestAdmin access tokenCreate or reconcile demo userAssign role and attributesUser ready201 Created关于identity-bootstrap-service的工作原理详见 10 — identity-bootstrap-service。流程 2用户登录你用凭据换取一个 JWT。该令牌携带身份与声明供后续每个请求使用。步骤客户端把usernamepasswordPOST 到Keycloak的 token 端点。Keycloak校验凭据。Keycloak返回一个签名的 JWT 访问令牌。KeycloakClientKeycloakClientPOST /token (username password)Validate credentialsSigned JWT access token关于Keycloaktoken 端点细节与 JWT 声明结构详见 06 — Keycloak / IdP。流程 3被允许的账户访问alice读取她自己的某个账户。KongPEP确认令牌有效OPAPDP确认alice拥有该账户banking-api-service在返回数据前再次校验。示例alice请求GET /api/accounts/A-1001其中A-1001属于alice。步骤客户端把 JWT 作为 bearer 令牌发给Kong。Kong用Keycloak对令牌做内省 —— 确认其处于 active 状态。Kong把解码后的声明与请求的account_id发给OPA。OPA评估策略并返回allow该账户在alice的account_ids声明中。Kong把请求转发给banking-api-service。banking-api-service再次校验 JWT 的签名、签发者与受众。banking-api-service确认alice拥有A-1001。banking-api-service返回200及账户数据。banking-api-serviceOPAKeycloakKongClientbanking-api-serviceOPAKeycloakKongClientGET /api/accounts/A-1001 JWTIntrospect tokenactiveaccount_idA-1001 alice claims roleallowForward requestValidate JWT (signature / issuer / audience)Confirm alice owns A-1001200 account data200 account data关于内省细节详见 11 — JWT 签名、校验与内省。关于 OPA 策略逻辑详见 08 — OPA。关于线级报文详见 14 — 请求与响应细节。流程 4被拒绝的账户访问alice尝试读取一个她并不拥有的账户。OPA在网关处就拒绝了它 —— 请求根本到不了banking-api-service。示例alice请求GET /api/accounts/A-2001其中A-2001属于另一个客户。作为对比ops-admin发起同样的请求会从OPA得到allow因为ops-admin角色被授予访问任意账户的权限。步骤客户端把 JWT 发给Kong。Kong对令牌做内省 —— 确认其处于 active 状态。Kong把解码后的声明与account_idA-2001发给OPA。OPA返回denyA-2001不在alice的account_ids声明中且她不具备ops-admin角色。Kong返回403 Forbidden。请求从未到达banking-api-service。OPAKeycloakKongClientOPAKeycloakKongClientGET /api/accounts/A-2001 JWT (alice)Introspect tokenactiveaccount_idA-2001 alice claims roledeny403 Forbidden关于 OPA 策略逻辑详见 08 — OPA。关于线级报文详见 14 — 请求与响应细节。流程 5缺失或被篡改的令牌没有有效令牌的请求会在任何策略检查之前就被Kong拒绝。缺失令牌客户端不带 bearer 令牌调用Kong。Kong立即以401 Unauthorized拒绝。被篡改的令牌客户端发送一个被修改过的 JWT。Kong用Keycloak对令牌做内省。Keycloak报告该令牌为 inactive签名不匹配或未知。Kong返回401 Unauthorized。KeycloakKongClientKeycloakKongClientalt[missing token][tampered token]API request (no token or tampered token)401 UnauthorizedIntrospect tokeninactive401 Unauthorized关于内省细节详见 11 — JWT 签名、校验与内省。这些流程为什么重要每个流程都体现了组件之间清晰的职责分离定义见 01 — 概念Keycloak负责认证并签名令牌。Kong在边缘执行访问控制并驱动策略检查。OPA仅依据策略规则判定允许或拒绝。banking-api-service再次校验并提供业务数据。没有任何组件越界去干别人的职责。← Prev: 02 — 本项目架构 · Next: 04 — 本地演示指南 → 返回专栏目录