jwt_resource.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.conf.urls import url
  4. from tastypie import http
  5. from tastypie.resources import Resource
  6. from tastypie.utils import trailing_slash
  7. from tastypie.exceptions import ImmediateHttpResponse
  8. from api.utils import jwt_token
  9. from api.utils.logger import (
  10. info,
  11. warning
  12. )
  13. from api.utils.email import send_email
  14. import simplejson as json
  15. '''
  16. '''
  17. class JWTResource(Resource):
  18. class Meta:
  19. allowed_methods = ['post']
  20. resource_name = 'auth'
  21. '''
  22. '''
  23. def prepend_urls(self):
  24. return [
  25. url(r'^%s/get_token%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('get_token'), name="api_get_token"),
  26. url(r'^%s/check_token%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('check_token'), name="api_check_token"),
  27. ]
  28. '''
  29. '''
  30. def get_token(self, request, **kwargs):
  31. self.method_check(request, allowed=self._meta.allowed_methods)
  32. # Check content type
  33. if request.content_type != 'application/json':
  34. warning('request is not json')
  35. raise ImmediateHttpResponse(response=http.HttpUnauthorized())
  36. # Check body
  37. if not request.body:
  38. warning('request body not exists')
  39. raise ImmediateHttpResponse(response=http.HttpUnauthorized())
  40. # Check required parameters
  41. body = json.loads(request.body)
  42. if 'username' not in body or 'password' not in body:
  43. warning('username or password not provided')
  44. raise ImmediateHttpResponse(response=http.HttpUnauthorized())
  45. # Check user
  46. token = jwt_token.create_token(body['username'], body['password'])
  47. if not token:
  48. warning('empty token')
  49. raise ImmediateHttpResponse(response=http.HttpUnauthorized())
  50. info('%s authenticated' % body['username'])
  51. # Send email
  52. email_sended = send_email(
  53. 'El usuario %s se autenticó al sistema con un nuevo token.\n%s' % (body['username'], token),
  54. body['username'],
  55. only_admins=True
  56. )
  57. if not email_sended:
  58. warning('%s email not sended' % body['username'])
  59. else:
  60. info('%s email sended' % body['username'])
  61. # Build bundle
  62. bundle = self.build_bundle(obj={
  63. 'token': token,
  64. 'username': body['username']
  65. }, request=request)
  66. return self.create_response(request, bundle.obj)
  67. '''
  68. '''
  69. def check_token(self, request, **kwargs):
  70. self.method_check(request, allowed=self._meta.allowed_methods)
  71. # Check content type
  72. if request.content_type != 'application/json':
  73. raise ImmediateHttpResponse(response=http.HttpUnauthorized())
  74. # Check body
  75. if not request.body:
  76. raise ImmediateHttpResponse(response=http.HttpUnauthorized())
  77. # Check required parameters
  78. body = json.loads(request.body)
  79. if 'token' not in body:
  80. raise ImmediateHttpResponse(response=http.HttpUnauthorized())
  81. (user, ok) = jwt_token.check_token(body['token'])
  82. # Check status
  83. response_status = (401, 200)[bool(ok)]
  84. if response_status == 401:
  85. raise ImmediateHttpResponse(response=http.HttpUnauthorized())
  86. bundle = self.build_bundle(obj={
  87. 'token': body['token'],
  88. 'username': user.username
  89. }, request=request)
  90. return self.create_response(request, bundle.obj)