jwt_resource.py 3.1 KB

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