forms.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. from calendar import timegm
  2. from datetime import datetime
  3. from django import forms
  4. from django.contrib.auth import authenticate
  5. from jwt_auth import settings
  6. from jwt_auth.compat import User
  7. jwt_payload_handler = settings.JWT_PAYLOAD_HANDLER
  8. jwt_encode_handler = settings.JWT_ENCODE_HANDLER
  9. jwt_decode_handler = settings.JWT_DECODE_HANDLER
  10. jwt_get_user_id_from_payload = settings.JWT_PAYLOAD_GET_USER_ID_HANDLER
  11. class JSONWebTokenForm(forms.Form):
  12. password = forms.CharField()
  13. def __init__(self, *args, **kwargs):
  14. super(JSONWebTokenForm, self).__init__(*args, **kwargs)
  15. # Dynamically add the USERNAME_FIELD to self.fields.
  16. self.fields[self.username_field] = forms.CharField()
  17. @property
  18. def username_field(self):
  19. try:
  20. return User.USERNAME_FIELD
  21. except AttributeError:
  22. return 'username'
  23. def clean(self):
  24. cleaned_data = super(JSONWebTokenForm, self).clean()
  25. credentials = {
  26. self.username_field: cleaned_data.get(self.username_field),
  27. 'password': cleaned_data.get('password')
  28. }
  29. if all(credentials.values()):
  30. user = authenticate(**credentials)
  31. if user:
  32. if not user.is_active:
  33. msg = 'User account is disabled.'
  34. raise forms.ValidationError(msg)
  35. payload = jwt_payload_handler(user)
  36. # Include original issued at time for a brand new token,
  37. # to allow token refresh
  38. if settings.JWT_ALLOW_REFRESH:
  39. payload['orig_iat'] = timegm(
  40. datetime.utcnow().utctimetuple()
  41. )
  42. self.object = {
  43. 'token': jwt_encode_handler(payload)
  44. }
  45. else:
  46. msg = 'Unable to login with provided credentials.'
  47. raise forms.ValidationError(msg)
  48. else:
  49. msg = 'Must include "username" and "password"'
  50. raise forms.ValidationError(msg)