utils.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from __future__ import unicode_literals
  2. from datetime import datetime
  3. import importlib
  4. import jwt
  5. def jwt_payload_handler(user):
  6. from jwt_auth import settings
  7. try:
  8. username = user.get_username()
  9. except AttributeError:
  10. username = user.username
  11. return {
  12. 'user_id': user.pk,
  13. 'email': user.email,
  14. 'username': username,
  15. 'exp': datetime.utcnow() + settings.JWT_EXPIRATION_DELTA
  16. }
  17. def jwt_get_user_id_from_payload_handler(payload):
  18. """
  19. Override this function if user_id is formatted differently in payload
  20. """
  21. user_id = payload.get('user_id')
  22. return user_id
  23. def jwt_encode_handler(payload):
  24. from jwt_auth import settings
  25. return jwt.encode(
  26. payload,
  27. settings.JWT_SECRET_KEY,
  28. settings.JWT_ALGORITHM
  29. ).decode('utf-8')
  30. def jwt_decode_handler(token):
  31. from jwt_auth import settings
  32. options = {
  33. 'verify_exp': settings.JWT_VERIFY_EXPIRATION,
  34. }
  35. return jwt.decode(
  36. token,
  37. settings.JWT_SECRET_KEY,
  38. settings.JWT_VERIFY,
  39. options=options,
  40. leeway=settings.JWT_LEEWAY
  41. )
  42. def import_from_string(val):
  43. """
  44. Attempt to import a class from a string representation.
  45. From: https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/settings.py
  46. """
  47. try:
  48. # Nod to tastypie's use of importlib.
  49. parts = val.split('.')
  50. module_path, class_name = '.'.join(parts[:-1]), parts[-1]
  51. module = importlib.import_module(module_path)
  52. return getattr(module, class_name)
  53. except ImportError as e:
  54. msg = "Could not import '%s' for setting. %s: %s." % (val, e.__class__.__name__, e)
  55. raise ImportError(msg)
  56. def get_authorization_header(request):
  57. """
  58. Return request's 'Authorization:' header, as a bytestring.
  59. From: https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/authentication.py
  60. """
  61. auth = request.META.get('HTTP_AUTHORIZATION', b'')
  62. if isinstance(auth, type('')):
  63. # Work around django test client oddness
  64. auth = auth.encode('iso-8859-1')
  65. return auth