Skip to content

Commit 54a1679

Browse files
author
maxim-lixakov
committed
[DOP-21268] - add KeycloakAuthProvider interaction schema
1 parent a0b8f1f commit 54a1679

File tree

3 files changed

+58
-2
lines changed

3 files changed

+58
-2
lines changed

docs/backend/auth/keycloak.rst

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,62 @@ TODO:
1616
Interaction schema
1717
------------------
1818

19-
TODO:
19+
.. dropdown:: Interaction schema
20+
21+
.. plantuml::
22+
23+
@startuml
24+
title Keycloak Authorization Flow
25+
participant "Client (User from Browser)" as Client
26+
participant "Syncmaster"
27+
participant "Keycloak"
28+
29+
== Client Authentication at Keycloak ==
30+
Client -> Syncmaster : Request endpoint that requires authentication (/v1/users)
31+
32+
Syncmaster x-[#red]> Client : Redirect to Keycloak login URL (if no access token)
33+
34+
Client -> Keycloak : Callback redirect to Keycloak login page
35+
36+
alt Successful login
37+
Client --> Keycloak : Log in with login and password
38+
else Login failed
39+
Keycloak x-[#red]> Client -- : Display error (401 Unauthorized)
40+
end
41+
42+
Keycloak -> Client : Redirect to Syncmaster to callback endpoint with code
43+
Client -> Syncmaster : Callback request to /v1/auth/callback with code
44+
Syncmaster-> Keycloak : Exchange code for access token
45+
Keycloak --> Syncmaster : Return JWT token
46+
Syncmaster --> Client : Set JWT token in user's browser in cookies and redirect /v1/users
47+
48+
Client --> Syncmaster : Redirect to /v1/users
49+
Syncmaster -> Syncmaster : Get user info from JWT token and check user in internal backend database
50+
Syncmaster -> Syncmaster : Create user in internal backend database if not exist
51+
Syncmaster -[#green]> Client -- : Return requested data
52+
53+
54+
55+
== GET v1/users ==
56+
alt Successful case
57+
Client -> Syncmaster : Request data with JWT token
58+
Syncmaster --> Syncmaster : Get user info from JWT token and check user in internal backend database
59+
Syncmaster -> Syncmaster : Create user in internal backend database if not exist
60+
Syncmaster -[#green]> Client -- : Return requested data
61+
62+
else Access token is expired
63+
Syncmaster -> Keycloak : Get new JWT token via refresh token
64+
Keycloak --> Syncmaster : Return new JWT token
65+
Syncmaster --> Syncmaster : Get user info from JWT token and check user in internal backend database
66+
Syncmaster -> Syncmaster : Create user in internal backend database if not exist
67+
Syncmaster -[#green]> Client -- : Return requested data and set new JWT token in user's browser in cookies
68+
69+
else Refresh token is expired
70+
Syncmaster x-[#red]> Client -- : Redirect to Keycloak login URL
71+
end
72+
73+
deactivate Client
74+
@enduml
2075

2176
Basic configuration
2277
-------------------

syncmaster/backend/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def application_factory(settings: Settings) -> FastAPI:
4747
},
4848
)
4949

50-
auth_class = settings.auth.provider
50+
auth_class: type[AuthProvider] = settings.auth.provider # type: ignore[assignment]
5151
auth_class.setup(application)
5252

5353
apply_middlewares(application, settings)

syncmaster/backend/settings/auth/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class AuthSettings(BaseModel):
2525
provider: ImportString = Field( # type: ignore[assignment]
2626
default="syncmaster.backend.providers.auth.dummy.DummyAuthProvider",
2727
description="Full name of auth provider class",
28+
validate_default=True,
2829
)
2930

3031
class Config:

0 commit comments

Comments
 (0)