diff --git a/access/urls.py b/access/urls.py index adafba8..8bd5c5e 100644 --- a/access/urls.py +++ b/access/urls.py @@ -1,7 +1,8 @@ -from django.conf.urls import url +from django.conf.urls import url, include import progress.views from access import views +from rest_framework_jwt.views import obtain_jwt_token, refresh_jwt_token urlpatterns = [ url(r'progress_detail/(?P[0-9A-Fa-f-]+)/$', progress.views.CourseProgressUserView.as_view()), @@ -12,7 +13,9 @@ urlpatterns = [ url(r'find/$', views.FindUserView.as_view()), url(r'registration/$', views.RegistrationView.as_view()), url(r'change_password/$', views.ChangePasswordView.as_view()), - url(r'login/$', views.LoginView.as_view(), name='login'), + url(r'^login/', obtain_jwt_token), + url(r'^token-refresh/', refresh_jwt_token), + # url(r'login/$', views.LoginView.as_view(), name='login'), url(r'logout/$', views.LogoutView.as_view()), url(r'reset/$', views.ResetPasswordView.as_view()), url(r'progress_detail/upload/(?P[0-9A-Fa-f-]+)/$', progress.views.UploadCourseProgressUserView.as_view()), diff --git a/access/views.py b/access/views.py index 6078584..cda626c 100644 --- a/access/views.py +++ b/access/views.py @@ -128,7 +128,7 @@ class FindUserView(APIView): class DetailUserView(APIView): renderer_classes = (JSONRenderer,) - permission_classes = (permissions.IsAuthenticated,) + # permission_classes = (permissions.IsAuthenticated,) @staticmethod def post(request, out_key=None): diff --git a/api_v1/urls.py b/api_v1/urls.py index d4b257b..50721fc 100644 --- a/api_v1/urls.py +++ b/api_v1/urls.py @@ -10,5 +10,5 @@ urlpatterns = [ url(r'finance/', include('finance.urls')), url(r'storage/', include('storage.urls')), url(r'progress/', include('progress.urls')), - url(r'^docs/$', schema_view, name='api-docs'), + # url(r'^docs/$', schema_view, name='api-docs'), ] diff --git a/lms/settings.py b/lms/settings.py index 5894e6f..842a003 100644 --- a/lms/settings.py +++ b/lms/settings.py @@ -1,6 +1,7 @@ # coding=utf-8 import os +import datetime import raven import environ import socket @@ -130,9 +131,9 @@ REST_FRAMEWORK = { 'rest_framework.authentication.SessionAuthentication', ), 'DEFAULT_PARSER_CLASSES': [ - 'rest_framework.parsers.FormParser', - 'rest_framework.parsers.MultiPartParser', - 'rest_framework.parsers.JSONParser', + 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', + 'rest_framework.authentication.SessionAuthentication', + 'rest_framework.authentication.BasicAuthentication', ], } @@ -257,6 +258,41 @@ LOGGING = { }, } +JWT_AUTH = { + 'JWT_ENCODE_HANDLER': + 'rest_framework_jwt.utils.jwt_encode_handler', + + 'JWT_DECODE_HANDLER': + 'rest_framework_jwt.utils.jwt_decode_handler', + + 'JWT_PAYLOAD_HANDLER': + 'lms.utils.custom_jwt_payload_handler', + + 'JWT_PAYLOAD_GET_USER_ID_HANDLER': + 'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler', + + 'JWT_RESPONSE_PAYLOAD_HANDLER': + 'rest_framework_jwt.utils.jwt_response_payload_handler', + + 'JWT_SECRET_KEY': SECRET_KEY, + 'JWT_GET_USER_SECRET_KEY': None, + 'JWT_PUBLIC_KEY': None, + 'JWT_PRIVATE_KEY': None, + 'JWT_ALGORITHM': 'HS256', + 'JWT_VERIFY': True, + 'JWT_VERIFY_EXPIRATION': True, + 'JWT_LEEWAY': 0, + 'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300), + 'JWT_AUDIENCE': 'Skillbox_Login', + 'JWT_ISSUER': 'LMS', + + 'JWT_ALLOW_REFRESH': True, + 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7), + + 'JWT_AUTH_HEADER_PREFIX': 'JWT', + 'JWT_AUTH_COOKIE': 'skillbox_token', +} + # Configure loggers for all local apps LOCAL_APPS_LOGGERS = {} for app in apps: diff --git a/lms/urls.py b/lms/urls.py index 9acba7b..280e268 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -12,7 +12,6 @@ urlpatterns = [ url(r'^static/(?P.*)/$', serve, {'document_root': settings.STATIC_ROOT}), url(r'^wallet/pay/check/$', YandexCheckView.as_view(), name='yandex_money_check'), url(r'^wallet/pay/result/$', YandexAvisoView.as_view(), name='yandex_money_notice'), - url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), url(r'^yandex-money/check/$', DemoYandexCheckView.as_view()), - url(r'^yandex-money/aviso/$', DemoYandexAvisoView.as_view()) + url(r'^yandex-money/aviso/$', DemoYandexAvisoView.as_view()), ] diff --git a/lms/utils.py b/lms/utils.py new file mode 100644 index 0000000..c3857fe --- /dev/null +++ b/lms/utils.py @@ -0,0 +1,25 @@ +from datetime import datetime +from calendar import timegm +from rest_framework_jwt.settings import api_settings + + +def custom_jwt_payload_handler(user): + + payload = { + 'exp': datetime.utcnow() + api_settings.JWT_EXPIRATION_DELTA, + 'out_key': str(user.out_key), + 'email': user.email, + } + + if api_settings.JWT_ALLOW_REFRESH: + payload['orig_iat'] = timegm( + datetime.utcnow().utctimetuple() + ) + + if api_settings.JWT_AUDIENCE is not None: + payload['aud'] = api_settings.JWT_AUDIENCE + + if api_settings.JWT_ISSUER is not None: + payload['iss'] = api_settings.JWT_ISSUER + + return payload diff --git a/requirements.txt b/requirements.txt index 3ad614f..5a9fadd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -18,6 +18,7 @@ Unidecode==0.4.21 PyJWT==1.5.3 dicttoxml==1.7.4 gunicorn==19.7.1 +djangorestframework-jwt-1.11.0 # testing flake8==3.5.0