Skip to content

Commit 750d6a4

Browse files
authored
Merge pull request #216 from openzim/ory_login
Move from login.kiwix.org to ory.login.kiwix.org
2 parents 1d1820e + e07d917 commit 750d6a4

5 files changed

Lines changed: 30 additions & 39 deletions

File tree

backend/src/cms_backend/api/context.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ class Context:
1414

1515
oauth_jwks_uri = os.getenv(
1616
"OAUTH_JWKS_URI",
17-
default="https://login.kiwix.org/.well-known/jwks.json",
17+
default="https://ory.login.kiwix.org/.well-known/jwks.json",
1818
)
19-
oauth_issuer = os.getenv("OAUTH_ISSUER", default="https://login.kiwix.org")
19+
oauth_issuer = os.getenv("OAUTH_ISSUER", default="https://ory.login.kiwix.org")
2020

2121
oauth_session_audience_id = os.getenv(
2222
"OAUTH_SESSION_AUDIENCE_ID", default="d87a31d2-874e-44c4-9dc2-63fad523bf1b"

backend/src/cms_backend/api/token.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ def decode(self, token: str) -> JWTClaims:
113113
raise ValueError(
114114
"2FA authentication is mandatory on CMS but it looks like you only "
115115
"have one setup on Ory. Please, configure a second one on Ory at "
116-
"https://login.kiwix.org/settings"
116+
f"{Context.oauth_issuer}/settings"
117117
)
118118
return JWTClaims.model_validate(decoded_token)
119119

backend/tests/api/test_token_decoder.py

Lines changed: 24 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@
99
from cms_backend.api.token import OAuthTokenDecoder
1010
from cms_backend.utils.datetime import getnow
1111

12+
TEST_ISSUER = "https://foo.acme.org"
13+
TEST_AUDIENCE_ID = "d87a31d2-874e-44c4-9dc2-63fad523bf1c"
14+
1215

1316
def create_test_session_jwt_token(
14-
issuer: str = "https://login.kiwix.org",
15-
audience_id: str = "d87a31d2-874e-44c4-9dc2-63fad523bf1b",
17+
issuer: str = TEST_ISSUER,
18+
audience_id: str = TEST_AUDIENCE_ID,
1619
subject: str | None = None,
1720
exp_delta: datetime.timedelta = datetime.timedelta(hours=1),
1821
aal: str = "aal2",
@@ -39,7 +42,7 @@ def create_test_session_jwt_token(
3942

4043

4144
def create_test_client_jwt_token(
42-
issuer: str = "https://login.kiwix.org",
45+
issuer: str = TEST_ISSUER,
4346
client_id: str = "test-client-id",
4447
subject: str | None = None,
4548
exp_delta: datetime.timedelta = datetime.timedelta(hours=1),
@@ -67,12 +70,10 @@ def test_verify_session_access_token_expired_token(
6770
monkeypatch: pytest.MonkeyPatch,
6871
):
6972
"""Test that expired session tokens raise ValueError."""
70-
monkeypatch.setattr(
71-
"cms_backend.api.context.Context.oauth_issuer", "https://login.kiwix.org"
72-
)
73+
monkeypatch.setattr("cms_backend.api.context.Context.oauth_issuer", TEST_ISSUER)
7374
monkeypatch.setattr(
7475
"cms_backend.api.context.Context.oauth_session_audience_id",
75-
"d87a31d2-874e-44c4-9dc2-63fad523bf1b",
76+
TEST_AUDIENCE_ID,
7677
)
7778

7879
test_token = create_test_session_jwt_token()
@@ -100,12 +101,10 @@ def test_verify_session_access_token_with_2fa_enabled_and_valid_aal(
100101
monkeypatch: pytest.MonkeyPatch,
101102
):
102103
"""Test successful verification when 2FA is enabled and user has aal2."""
103-
monkeypatch.setattr(
104-
"cms_backend.api.context.Context.oauth_issuer", "https://login.kiwix.org"
105-
)
104+
monkeypatch.setattr("cms_backend.api.context.Context.oauth_issuer", TEST_ISSUER)
106105
monkeypatch.setattr(
107106
"cms_backend.api.context.Context.oauth_session_audience_id",
108-
"d87a31d2-874e-44c4-9dc2-63fad523bf1b",
107+
TEST_AUDIENCE_ID,
109108
)
110109
monkeypatch.setattr(
111110
"cms_backend.api.context.Context.oauth_session_login_require_2fa", True
@@ -118,9 +117,9 @@ def test_verify_session_access_token_with_2fa_enabled_and_valid_aal(
118117
mock_signing_key.key = "test-key"
119118

120119
decoded_payload = {
121-
"iss": "https://login.kiwix.org",
120+
"iss": TEST_ISSUER,
122121
"sub": str(UUID(int=0)),
123-
"aud": "d87a31d2-874e-44c4-9dc2-63fad523bf1b",
122+
"aud": TEST_AUDIENCE_ID,
124123
"name": "Test User",
125124
"iat": int(getnow().timestamp()),
126125
"exp": int((getnow() + datetime.timedelta(hours=1)).timestamp()),
@@ -150,12 +149,10 @@ def test_verify_session_access_token_with_2fa_enabled_only_aal1(
150149
monkeypatch: pytest.MonkeyPatch,
151150
):
152151
"""Test verification fails when 2FA is enabled but only aal1 is present."""
153-
monkeypatch.setattr(
154-
"cms_backend.api.context.Context.oauth_issuer", "https://login.kiwix.org"
155-
)
152+
monkeypatch.setattr("cms_backend.api.context.Context.oauth_issuer", TEST_ISSUER)
156153
monkeypatch.setattr(
157154
"cms_backend.api.context.Context.oauth_session_audience_id",
158-
"d87a31d2-874e-44c4-9dc2-63fad523bf1b",
155+
TEST_AUDIENCE_ID,
159156
)
160157
monkeypatch.setattr(
161158
"cms_backend.api.context.Context.oauth_session_login_require_2fa", True
@@ -167,9 +164,9 @@ def test_verify_session_access_token_with_2fa_enabled_only_aal1(
167164
mock_signing_key.key = "test-key"
168165

169166
decoded_payload = {
170-
"iss": "https://login.kiwix.org",
167+
"iss": TEST_ISSUER,
171168
"sub": str(UUID(int=0)),
172-
"aud": "d87a31d2-874e-44c4-9dc2-63fad523bf1b",
169+
"aud": TEST_AUDIENCE_ID,
173170
"name": "Test User",
174171
"iat": int(getnow().timestamp()),
175172
"exp": int((getnow() + datetime.timedelta(hours=1)).timestamp()),
@@ -198,12 +195,10 @@ def test_verify_session_access_token_with_2fa_disabled_only_aal1(
198195
"""
199196
Test that verification succeeds when 2FA is disabled even with only aal1
200197
"""
201-
monkeypatch.setattr(
202-
"cms_backend.api.context.Context.oauth_issuer", "https://login.kiwix.org"
203-
)
198+
monkeypatch.setattr("cms_backend.api.context.Context.oauth_issuer", TEST_ISSUER)
204199
monkeypatch.setattr(
205200
"cms_backend.api.context.Context.oauth_session_audience_id",
206-
"d87a31d2-874e-44c4-9dc2-63fad523bf1b",
201+
TEST_AUDIENCE_ID,
207202
)
208203
monkeypatch.setattr(
209204
"cms_backend.api.context.Context.oauth_session_login_require_2fa", False
@@ -215,9 +210,9 @@ def test_verify_session_access_token_with_2fa_disabled_only_aal1(
215210
mock_signing_key.key = "test-key"
216211

217212
decoded_payload = {
218-
"iss": "https://login.kiwix.org",
213+
"iss": TEST_ISSUER,
219214
"sub": str(UUID(int=0)),
220-
"aud": "d87a31d2-874e-44c4-9dc2-63fad523bf1b",
215+
"aud": TEST_AUDIENCE_ID,
221216
"name": "Test User",
222217
"iat": int(getnow().timestamp()),
223218
"exp": int((getnow() + datetime.timedelta(hours=1)).timestamp()),
@@ -248,9 +243,7 @@ def test_verify_client_access_token_valid(
248243
monkeypatch: pytest.MonkeyPatch,
249244
):
250245
"""Test successful verification of valid OAuth2 client token."""
251-
monkeypatch.setattr(
252-
"cms_backend.api.context.Context.oauth_issuer", "https://login.kiwix.org"
253-
)
246+
monkeypatch.setattr("cms_backend.api.context.Context.oauth_issuer", TEST_ISSUER)
254247
monkeypatch.setattr(
255248
"cms_backend.api.context.Context.oauth_client_id",
256249
"test-client-id",
@@ -262,7 +255,7 @@ def test_verify_client_access_token_valid(
262255
mock_signing_key.key = "test-key"
263256

264257
decoded_payload = {
265-
"iss": "https://login.kiwix.org",
258+
"iss": TEST_ISSUER,
266259
"sub": str(UUID(int=0)),
267260
"client_id": str(UUID(int=0)),
268261
"iat": int(getnow().timestamp()),
@@ -291,9 +284,7 @@ def test_verify_client_access_token_invalid_client_id(
291284
monkeypatch: pytest.MonkeyPatch,
292285
):
293286
"""Test verification fails when client_id doesn't match."""
294-
monkeypatch.setattr(
295-
"cms_backend.api.context.Context.oauth_issuer", "https://login.kiwix.org"
296-
)
287+
monkeypatch.setattr("cms_backend.api.context.Context.oauth_issuer", TEST_ISSUER)
297288
monkeypatch.setattr(
298289
"cms_backend.api.context.Context.oauth_client_id",
299290
"expected-client-id",
@@ -305,7 +296,7 @@ def test_verify_client_access_token_invalid_client_id(
305296
mock_signing_key.key = "test-key"
306297

307298
decoded_payload = {
308-
"iss": "https://login.kiwix.org",
299+
"iss": TEST_ISSUER,
309300
"sub": str(UUID(int=0)),
310301
"client_id": "wrong-client-id",
311302
"iat": int(getnow().timestamp()),

dev/docker-compose.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ services:
3737
WEB_CONCURRENCY: 1
3838
DATABASE_URL: postgresql+psycopg://cms:cmspass@postgresdb:5432/cms
3939
ALLOWED_ORIGINS: http://localhost:37600,http://localhost:37603
40-
OAUTH_JWKS_URI: https://login-staging.kiwix.org/.well-known/jwks.json
41-
OAUTH_ISSUER: https://login-staging.kiwix.org
40+
OAUTH_JWKS_URI: https://ory.login-staging.kiwix.org/.well-known/jwks.json
41+
OAUTH_ISSUER: https://ory.login-staging.kiwix.org
4242
OAUTH_SESSION_AUDIENCE_ID: 309693e7-ad5e-4379-bf93-ba89314230fd
4343
OAUTH_SESSION_LOGIN_REQUIRE_2FA: true
4444
CREATE_NEW_OAUTH_ACCOUNT: true

dev/frontend-dev/config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"CMS_API": "http://localhost:37601/v1",
3-
"OAUTH_BASE_URL": "https://login-staging.kiwix.org",
3+
"OAUTH_BASE_URL": "https://ory.login-staging.kiwix.org",
44
"LOGIN_MODES": ["local", "oauth"]
55
}

0 commit comments

Comments
 (0)