|
1 | 1 | # -*- coding: utf-8 -*-
|
2 |
| - |
3 | 2 | # This file is part of wger Workout Manager.
|
4 | 3 | #
|
5 | 4 | # wger Workout Manager is free software: you can redistribute it and/or modify
|
|
16 | 15 | # along with Workout Manager. If not, see <http://www.gnu.org/licenses/>.
|
17 | 16 |
|
18 | 17 | # Standard Library
|
| 18 | +import json |
19 | 19 | import logging
|
| 20 | +import time |
| 21 | +from base64 import urlsafe_b64decode |
20 | 22 |
|
21 | 23 | # Django
|
22 | 24 | from django.conf import settings
|
23 |
| -from django.contrib.auth.decorators import login_required |
24 | 25 | from django.contrib.auth.models import User
|
25 | 26 | from django.http import (
|
26 | 27 | HttpResponseForbidden,
|
|
38 | 39 | extend_schema,
|
39 | 40 | inline_serializer,
|
40 | 41 | )
|
| 42 | +from jose.constants import ALGORITHMS |
| 43 | +from jose.exceptions import JWKError |
| 44 | +from jose.jwt import encode |
41 | 45 | from rest_framework import (
|
42 | 46 | status,
|
43 | 47 | viewsets,
|
@@ -414,30 +418,52 @@ class RoutineWeightUnitViewSet(viewsets.ReadOnlyModelViewSet):
|
414 | 418 | filterset_fields = ('name',)
|
415 | 419 |
|
416 | 420 |
|
| 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 | + |
417 | 448 | @api_view()
|
418 |
| -def get_token_for_user(request): |
| 449 | +def get_powersync_token(request): |
419 | 450 | if not request.user.is_authenticated:
|
420 | 451 | return HttpResponseForbidden()
|
421 | 452 |
|
422 |
| - token = AccessToken.for_user(request.user) |
| 453 | + token = create_jwt_token(request.user.id) |
423 | 454 |
|
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) |
432 | 459 |
|
433 | 460 |
|
434 | 461 | @api_view()
|
435 | 462 | 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) |
438 | 464 |
|
439 | 465 | return JsonResponse(
|
440 |
| - {'keys': [settings.POWERSYNC_JWKS_PUBLIC_KEY]}, |
| 466 | + {'keys': [json.loads(power_sync_public_key_bytes.decode('utf-8'))]}, |
441 | 467 | status=200,
|
442 | 468 | )
|
443 | 469 |
|
|
0 commit comments