Skip to content

Commit f5f67bf

Browse files
committed
Fix the powersync key generation
This still needs to be clean up (specially the key generation, at the moment we use a new dependency, but all this can be also done with the library we currently use)
1 parent 5f71782 commit f5f67bf

File tree

3 files changed

+44
-17
lines changed

3 files changed

+44
-17
lines changed

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ icalendar==5.0.13
2727
invoke==2.2.0
2828
openfoodfacts==0.4.0
2929
pillow==10.4.0
30+
python_jose==3.3.0
3031
reportlab==4.2.2
3132
requests==2.32.3
3233
tqdm==4.66.4

wger/core/api/views.py

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
# -*- coding: utf-8 -*-
2-
32
# This file is part of wger Workout Manager.
43
#
54
# wger Workout Manager is free software: you can redistribute it and/or modify
@@ -16,11 +15,13 @@
1615
# along with Workout Manager. If not, see <http://www.gnu.org/licenses/>.
1716

1817
# Standard Library
18+
import json
1919
import logging
20+
import time
21+
from base64 import urlsafe_b64decode
2022

2123
# Django
2224
from django.conf import settings
23-
from django.contrib.auth.decorators import login_required
2425
from django.contrib.auth.models import User
2526
from django.http import (
2627
HttpResponseForbidden,
@@ -38,6 +39,9 @@
3839
extend_schema,
3940
inline_serializer,
4041
)
42+
from jose.constants import ALGORITHMS
43+
from jose.exceptions import JWKError
44+
from jose.jwt import encode
4145
from rest_framework import (
4246
status,
4347
viewsets,
@@ -414,30 +418,52 @@ class RoutineWeightUnitViewSet(viewsets.ReadOnlyModelViewSet):
414418
filterset_fields = ('name',)
415419

416420

421+
def create_jwt_token(user_id):
422+
power_sync_private_key_bytes = urlsafe_b64decode(settings.POWERSYNC_JWKS_PRIVATE_KEY)
423+
power_sync_private_key_json = json.loads(power_sync_private_key_bytes.decode('utf-8'))
424+
425+
try:
426+
jwt_header = {
427+
'alg': power_sync_private_key_json['alg'],
428+
'kid': power_sync_private_key_json['kid'],
429+
}
430+
431+
jwt_payload = {
432+
'sub': user_id,
433+
'iat': time.time(),
434+
'aud': 'powersync',
435+
'exp': int(time.time()) + 300, # 5 minutes expiration
436+
}
437+
438+
token = encode(
439+
jwt_payload, power_sync_private_key_json, algorithm=ALGORITHMS.RS256, headers=jwt_header
440+
)
441+
442+
return token
443+
444+
except (JWKError, ValueError, KeyError) as e:
445+
raise Exception(f'Error creating JWT token: {str(e)}')
446+
447+
417448
@api_view()
418-
def get_token_for_user(request):
449+
def get_powersync_token(request):
419450
if not request.user.is_authenticated:
420451
return HttpResponseForbidden()
421452

422-
token = AccessToken.for_user(request.user)
453+
token = create_jwt_token(request.user.id)
423454

424-
return JsonResponse(
425-
data={
426-
'token': str(token),
427-
'type': str(token.token_type),
428-
'user': request.user.username,
429-
'powersync_url': 'http://powersync:8080',
430-
}
431-
)
455+
try:
456+
return JsonResponse({'token': token, 'powersync_url': settings.POWERSYNC_URL}, status=200)
457+
except Exception as e:
458+
return JsonResponse({'error': str(e)}, status=500)
432459

433460

434461
@api_view()
435462
def get_powersync_keys(request):
436-
if not request.user.is_authenticated:
437-
return HttpResponseForbidden()
463+
power_sync_public_key_bytes = urlsafe_b64decode(settings.POWERSYNC_JWKS_PUBLIC_KEY)
438464

439465
return JsonResponse(
440-
{'keys': [settings.POWERSYNC_JWKS_PUBLIC_KEY]},
466+
{'keys': [json.loads(power_sync_public_key_bytes.decode('utf-8'))]},
441467
status=200,
442468
)
443469

wger/urls.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@
279279
),
280280
path(
281281
'api/v2/powersync-token',
282-
core_api_views.get_token_for_user,
282+
core_api_views.get_powersync_token,
283283
name='get_token',
284284
),
285285
path(
@@ -290,7 +290,7 @@
290290
path(
291291
'api/v2/upload-powersync-data',
292292
core_api_views.upload_powersync_data,
293-
name='powersync-keys',
293+
name='powersync-data',
294294
),
295295
# Api documentation
296296
path(

0 commit comments

Comments
 (0)