jwt_token.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.conf import settings
  4. from django.contrib.auth import authenticate
  5. from django.contrib.auth.models import User
  6. from django.utils.crypto import constant_time_compare
  7. from jwt import DecodeError
  8. import jwt
  9. '''
  10. '''
  11. def create_token(username, password):
  12. # Check if exists jwt key
  13. if not settings.JWT_SECRET_KEY:
  14. return None
  15. user = authenticate(username=username, password=password)
  16. # Check user authentication
  17. if not user:
  18. return user
  19. payload = {
  20. 'uid': user.id,
  21. 'password': user.password
  22. }
  23. return jwt.encode(payload, settings.JWT_SECRET_KEY, algorithm='HS256')
  24. '''
  25. '''
  26. def explode_token(token):
  27. if not token:
  28. return False
  29. # Normalize token
  30. if token.startswith(settings.JWT_PREFIX_HEADER):
  31. prefix_length = len(settings.JWT_PREFIX_HEADER)
  32. token = token[prefix_length + 1:]
  33. # Check if exists jwt key
  34. if not settings.JWT_SECRET_KEY:
  35. return None
  36. payload = None
  37. try:
  38. payload = jwt.decode(token, settings.JWT_SECRET_KEY, algorithm='HS256')
  39. except DecodeError:
  40. return False
  41. # Check payload parameters
  42. if 'uid' not in payload or 'password' not in payload:
  43. return False
  44. return payload
  45. '''
  46. '''
  47. def get_user(token):
  48. payload = explode_token(token)
  49. user = User.objects.get(pk=payload['uid'])
  50. return user
  51. '''
  52. '''
  53. def get_username(token):
  54. user = get_user(token)
  55. # Check if exists user
  56. if not user:
  57. return user
  58. return user.name
  59. '''
  60. '''
  61. def check_token(token):
  62. payload = explode_token(token)
  63. if not payload:
  64. return (None, False)
  65. user = User.objects.get(pk=payload['uid'])
  66. # Check if exists user
  67. if not user:
  68. return (None, False)
  69. return (user, constant_time_compare(user.password, payload['password']))