diff --git a/drf_passwordless_jwt/settings.py b/drf_passwordless_jwt/settings.py index d3d85ca..373374a 100644 --- a/drf_passwordless_jwt/settings.py +++ b/drf_passwordless_jwt/settings.py @@ -72,7 +72,9 @@ if getenv('OTP_EMAIL_HTML'): PASSWORDLESS_AUTH['PASSWORDLESS_EMAIL_TOKEN_HTML_TEMPLATE_NAME'] = getenv('OTP_EMAIL_HTML') -OTP_TOKEN_CLEAN_SECONDS = int(getenv('OTP_TOKEN_CLEAN_SECONDS', 60 * 60 * 30)) +OTP_TOKEN_CLEAN_SECONDS = int(getenv('OTP_TOKEN_CLEAN_SECONDS', 3600 * 24 * 30)) +JWT_EXPIRE_SECONDS = int(getenv('JWT_EXPIRE_SECONDS', 3600 * 24 * 30)) +JWT_SECRET = getenv('JWT_SECRET', 'a long long secret string') if getenv('EMAIL_BACKEND_TEST'): EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' @@ -89,9 +91,8 @@ EMAIL_WHITE_LIST = getenv('EMAIL_WHITE_LIST', r'.*') EMAIL_WHITE_LIST_MESSAGE = getenv('EMAIL_WHITE_LIST_MESSAGE', 'email address not in white list') - -JWT_SECRET = getenv('JWT_SECRET', 'your secret key') -JWT_EXPIRE_SECONDS = int(getenv('JWT_EXPIRE_SECONDS', 60 * 60 * 24 * 30)) +EMAIL_TEST_ACCOUNT_PREFIX = getenv('EMAIL_TEST_ACCOUNT_PREFIX', + 'EMAIL_TEST_ACCOUNT_') if getenv('CORS_ALLOWED_ORIGINS'): CORS_ALLOWED_ORIGINS = getenv('CORS_ALLOWED_ORIGINS').split(',') diff --git a/drf_passwordless_jwt/testaccount.py b/drf_passwordless_jwt/testaccount.py new file mode 100644 index 0000000..4c7b1d5 --- /dev/null +++ b/drf_passwordless_jwt/testaccount.py @@ -0,0 +1,11 @@ +from django.conf import settings +from os import getenv + +def get_test_account_token(email): + name = email.replace('@', '_at_').replace('.', '_') + env = '{}{}'.format(settings.EMAIL_TEST_ACCOUNT_PREFIX, name) + return getenv(env) + + +def exists_test_account(email): + return bool(get_test_account_token(email)) diff --git a/drf_passwordless_jwt/views.py b/drf_passwordless_jwt/views.py index 659fe49..aea4baa 100644 --- a/drf_passwordless_jwt/views.py +++ b/drf_passwordless_jwt/views.py @@ -12,17 +12,31 @@ from .utils import generate_jwt from .serializers import EmailAuthWhiteListSerializer, JWTSerializer +from .testaccount import get_test_account_token, exists_test_account class ObtainEmailTokenView(ObtainEmailCallbackToken): serializer_class = EmailAuthWhiteListSerializer + def post(self, request, *args, **kwargs): + email = request.data['email'] + if exists_test_account(email): + return Response({'detail': + f'test account email {email!r} available'}) + + return super(ObtainEmailTokenView, self).post(request, *args, **kwargs) class ObtainJWTView(ObtainAuthTokenFromCallbackToken): def post(self, request, *args, **kwargs): email = request.data['email'] - resp = super(ObtainJWTView, self).post(request, *args, - **kwargs) + if exists_test_account(email): + if request.data['token'] == get_test_account_token(email): + return Response({ + 'email': email, + 'token': generate_jwt(email), + }) + + resp = super(ObtainJWTView, self).post(request, *args, **kwargs) token = generate_jwt(email) resp.data['email'] = email resp.data['token'] = token @@ -41,6 +55,13 @@ class VerifyJWTView(APIView): serializer_class = JWTSerializer def post(self, request, *args, **kwargs): + email = request.data['email'] + if exists_test_account(email): + return Response({ + 'email': email, + 'exp': '9999-12-31T23:59:59', + }) + serializer = self.serializer_class(data=request.data, context={'request': request}) if serializer.is_valid(raise_exception=False):