jwt_resource.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. import simplejson as json
  10. '''
  11. '''
  12. class JWTResource(Resource):
  13. class Meta:
  14. allowed_methods = ['post']
  15. resource_name = 'auth'
  16. '''
  17. '''
  18. def prepend_urls(self):
  19. return [
  20. url(r'^%s/get_token%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('get_token'), name="api_get_token"),
  21. url(r'^%s/check_token%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('check_token'), name="api_check_token"),
  22. ]
  23. '''
  24. '''
  25. def get_token(self, request, **kwargs):
  26. self.method_check(request, allowed=self._meta.allowed_methods)
  27. # Check content type
  28. if request.content_type != 'application/json':
  29. raise ImmediateHttpResponse(response=http.HttpUnauthorized())
  30. # Check body
  31. if not request.body:
  32. raise ImmediateHttpResponse(response=http.HttpUnauthorized())
  33. # Check required parameters
  34. body = json.loads(request.body)
  35. if 'username' not in body or 'password' not in body:
  36. raise ImmediateHttpResponse(response=http.HttpUnauthorized())
  37. # Check user
  38. token = jwt_token.create_token(body['username'], body['password'])
  39. if not token:
  40. raise ImmediateHttpResponse(response=http.HttpUnauthorized())
  41. bundle = self.build_bundle(obj={
  42. 'token': token,
  43. 'username': body['username']
  44. }, request=request)
  45. return self.create_response(request, bundle.obj)
  46. '''
  47. '''
  48. def check_token(self, request, **kwargs):
  49. self.method_check(request, allowed=self._meta.allowed_methods)
  50. # Check content type
  51. if request.content_type != 'application/json':
  52. raise ImmediateHttpResponse(response=http.HttpUnauthorized())
  53. # Check body
  54. if not request.body:
  55. raise ImmediateHttpResponse(response=http.HttpUnauthorized())
  56. # Check required parameters
  57. body = json.loads(request.body)
  58. if 'token' not in body:
  59. raise ImmediateHttpResponse(response=http.HttpUnauthorized())
  60. (user, ok) = jwt_token.check_token(body['token'])
  61. # Check status
  62. response_status = (401, 200)[bool(ok)]
  63. if response_status == 401:
  64. raise ImmediateHttpResponse(response=http.HttpUnauthorized())
  65. bundle = self.build_bundle(obj={
  66. 'token': body['token'],
  67. 'username': user.username
  68. }, request=request)
  69. return self.create_response(request, bundle.obj)