diff --git a/README.md b/README.md index 07a49d7..5248acb 100644 --- a/README.md +++ b/README.md @@ -106,3 +106,57 @@ npm run dev - PostgreSQL runs on port 5432 (internal) +## Sequence Diagram of the Flow + +```mermaid + +sequenceDiagram + participant Browser as Frontend #40;React#41; + participant YARP as BFF/YARP Proxy + participant TokenHandler as Token Handler Middleware + participant Cache as Hybrid Cache + participant Keycloak as Keycloak #40;IdP#41; + participant API as Backend API + + Note over Browser,API: Initial Authentication Flow + + Browser->>YARP: 1. Access protected resource + YARP->>TokenHandler: 2. Check authentication + TokenHandler->>Browser: 3. Redirect to /Account/Login + Browser->>YARP: 4. GET /Account/Login + YARP->>Keycloak: 5. OIDC Authorization Request + Keycloak->>Browser: 6. Login page + Browser->>Keycloak: 7. Submit credentials + Keycloak->>YARP: 8. Authorization code #40;callback#41; + + Note over YARP,Keycloak: Token Exchange + YARP->>Keycloak: 9. Exchange code for tokens
#40;OnAuthorizationCodeReceived#41; + Keycloak->>YARP: 10. Access + Refresh tokens + + Note over YARP,Cache: Token Storage + YARP->>Cache: 11. Store tokens with session-id
#40;OnTokenValidated#41; + YARP->>Browser: 12. Set session-id cookie #40;HttpOnly, Secure#41; + YARP->>Browser: 13. Redirect to original URL + + Note over Browser,API: Subsequent API Calls + + Browser->>YARP: 14. API request with session-id cookie + YARP->>TokenHandler: 15. AuthenticationHeaderSubstitutionMiddleware + TokenHandler->>Cache: 16. Retrieve tokens by session-id + Cache->>TokenHandler: 17. Return OAuthTokenResponse + TokenHandler->>TokenHandler: 18. Add Authorization: Bearer {#35;access_token{#35;} + TokenHandler->>API: 19. Proxied request with Bearer token + API->>API: 20. Validate JWT token + API->>TokenHandler: 21. API response + TokenHandler->>Browser: 22. Response #40;without tokens#41; + + Note over Browser,API: Token Refresh #40;if needed#41; + + Browser->>YARP: 23. API request #40;expired token#41; + TokenHandler->>Cache: 24. Get tokens + TokenHandler->>Keycloak: 25. Refresh token request + Keycloak->>TokenHandler: 26. New access token + TokenHandler->>Cache: 27. Update cached tokens + TokenHandler->>API: 28. Retry with new token + +``` \ No newline at end of file