Commit f420a67c by Clinton Blackburn

Merge pull request #71 from edx/clintonb/edx-drf-extensions-update

Using jwt_decode_handler from edx-drf-extensions
parents 907c3b4e d0d76df9
"""
Custom JWT decoding function for django_rest_framework jwt package.
Adds logging to facilitate debugging of InvalidTokenErrors. Also
requires "exp" and "iat" claims to be present - the base package
doesn't expose settings to enforce this.
"""
import logging
import jwt
from rest_framework_jwt.settings import api_settings
logger = logging.getLogger(__name__)
def decode(token):
"""
Ensure InvalidTokenErrors are logged for diagnostic purposes, before
failing authentication.
Args:
token (str): JSON web token (JWT) to be decoded.
"""
options = {
'verify_exp': api_settings.JWT_VERIFY_EXPIRATION,
'require_exp': True,
'require_iat': True,
}
try:
return jwt.decode(
token,
api_settings.JWT_SECRET_KEY,
api_settings.JWT_VERIFY,
options=options,
leeway=api_settings.JWT_LEEWAY,
audience=api_settings.JWT_AUDIENCE,
issuer=api_settings.JWT_ISSUER,
algorithms=[api_settings.JWT_ALGORITHM]
)
except jwt.InvalidTokenError:
logger.exception('JWT decode failed!')
raise
import jwt
from django.test import TestCase
from course_discovery.apps.api.jwt_decode_handler import decode
from course_discovery.apps.api.tests.jwt_utils import generate_jwt_payload, generate_jwt_token
from course_discovery.apps.core.tests.factories import UserFactory
class JWTDecodeHandlerTests(TestCase):
def setUp(self):
super(JWTDecodeHandlerTests, self).setUp()
self.user = UserFactory(is_staff=True, is_superuser=True)
self.payload = generate_jwt_payload(self.user)
self.jwt = generate_jwt_token(self.payload)
def test_decode_success(self):
self.assertDictEqual(decode(self.jwt), self.payload)
def test_decode_error(self):
with self.assertRaises(jwt.InvalidTokenError):
decode("not.a.valid.jwt")
...@@ -288,7 +288,7 @@ JWT_AUTH = { ...@@ -288,7 +288,7 @@ JWT_AUTH = {
'JWT_ALGORITHM': 'HS256', 'JWT_ALGORITHM': 'HS256',
'JWT_AUDIENCE': 'course-discovery', 'JWT_AUDIENCE': 'course-discovery',
'JWT_ISSUER': 'course-discovery', 'JWT_ISSUER': 'course-discovery',
'JWT_DECODE_HANDLER': 'course_discovery.apps.api.jwt_decode_handler.decode', 'JWT_DECODE_HANDLER': 'edx_rest_framework_extensions.utils.jwt_decode_handler',
} }
SWAGGER_SETTINGS = { SWAGGER_SETTINGS = {
......
...@@ -11,7 +11,7 @@ django-rest-swagger[reST]==0.3.5 ...@@ -11,7 +11,7 @@ django-rest-swagger[reST]==0.3.5
dry-rest-permissions==0.1.6 dry-rest-permissions==0.1.6
edx-auth-backends==0.1.3 edx-auth-backends==0.1.3
edx-ccx-keys==0.2.0 edx-ccx-keys==0.2.0
edx-drf-extensions==0.3.0 edx-drf-extensions==0.4.1
edx-opaque-keys==0.3.0 edx-opaque-keys==0.3.0
edx-rest-api-client==1.5.0 edx-rest-api-client==1.5.0
elasticsearch>=1.0.0,<2.0.0 elasticsearch>=1.0.0,<2.0.0
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment