jwt_resource.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.conf.urls import url
  4. from tastypie.resources import Resource
  5. from tastypie.utils import trailing_slash
  6. from api.utils import jwt_token
  7. import simplejson as json
  8. '''
  9. '''
  10. class JWTResource(Resource):
  11. class Meta:
  12. allowed_methods = ['post']
  13. resource_name = 'auth'
  14. '''
  15. '''
  16. def prepend_urls(self):
  17. return [
  18. url(r'^%s/get_token%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('get_token'), name="api_get_token"),
  19. url(r'^%s/check_token%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('check_token'), name="api_check_token"),
  20. ]
  21. '''
  22. '''
  23. def get_token(self, request, **kwargs):
  24. self.method_check(request, allowed=self._meta.allowed_methods)
  25. # Check content type
  26. if request.content_type != 'application/json':
  27. return self.create_response(request, {
  28. 'status': 401,
  29. 'error_message': 'request is not json'
  30. })
  31. # Check body
  32. if not request.body:
  33. return self.create_response(request, {
  34. 'status': 401,
  35. 'error_message': 'request body is empty'
  36. })
  37. body = json.loads(request.body)
  38. # Check required parameters
  39. if 'username' not in body or 'password' not in body:
  40. return self.create_response(request, {
  41. 'status': 401,
  42. 'error_message': 'username or password not provided in request'
  43. })
  44. token = jwt_token.create_token(body['username'], body['password'])
  45. # Check user
  46. if not token:
  47. return self.create_response(request, {
  48. 'status': 401,
  49. 'error_message': 'cannot authenticate user'
  50. })
  51. bundle = self.build_bundle(obj={
  52. 'status': 200,
  53. 'token': token,
  54. 'username': body['username']
  55. }, request=request)
  56. return self.create_response(request, bundle.obj)
  57. '''
  58. '''
  59. def check_token(self, request, **kwargs):
  60. self.method_check(request, allowed=self._meta.allowed_methods)
  61. # Check content type
  62. if request.content_type != 'application/json':
  63. return self.create_response(request, {
  64. 'status': 401,
  65. 'error': 'request is not json'
  66. })
  67. # Check body
  68. if not request.body:
  69. return self.create_response(request, {
  70. 'status': 401,
  71. 'error': 'request body is empty'
  72. })
  73. body = json.loads(request.body)
  74. # Check required parameters
  75. if 'token' not in body:
  76. return self.create_response(request, {
  77. 'status': 401,
  78. 'error': 'token not provided in request'
  79. })
  80. nice_token = jwt_token.check_token(body['token'])
  81. bundle = self.build_bundle(obj={
  82. 'status': (401, 200)[bool(nice_token)],
  83. 'token': body['token']
  84. }, request=request)
  85. return self.create_response(request, bundle.obj)