auth.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. import logging
  5. import time
  6. from django.conf import settings
  7. from typing import Optional, TYPE_CHECKING
  8. from apps.web.user.models import MyUser
  9. from apps.web.utils import trace_call
  10. from middlewares.django_jwt_session_auth import jwt_login, jwt_session_key
  11. if TYPE_CHECKING:
  12. from django.http.request import HttpRequest
  13. from django.http.response import HttpResponseRedirect
  14. logger = logging.getLogger(__name__)
  15. def user_to_payload(user):
  16. # type: (MyUser)->dict
  17. exp = datetime.datetime.now() + datetime.timedelta(seconds = 3600 * 24 * 30)
  18. return {
  19. 'user_id': str(user.id),
  20. 'iat': int(time.time()),
  21. 'exp': exp
  22. }
  23. def payload_to_user(payload):
  24. # type: (dict)->Optional[MyUser]
  25. if not payload:
  26. return None
  27. user_id = payload.get('user_id')
  28. try:
  29. user = MyUser.objects.get(id = user_id)
  30. except:
  31. user = None
  32. return user
  33. def end_user_login(request, user):
  34. # type:(HttpRequest, MyUser)->str
  35. return jwt_login(settings.SERVICE_DOMAIN.USER, user, request)
  36. end_user_login_session_key = jwt_session_key(settings.SERVICE_DOMAIN.USER)
  37. @trace_call(logger = logger)
  38. def response_with_login(request, user, response):
  39. # type:(HttpRequest, MyUser, HttpResponseRedirect)->HttpResponseRedirect
  40. token = end_user_login(request, user)
  41. logger.debug("{} login in.".format(repr(user)))
  42. response.set_cookie(key = settings.JWT_AUTH_DOMAIN_COOKIE_NAME,
  43. value = settings.SERVICE_DOMAIN.USER,
  44. max_age = 3600 * 24 * 30,
  45. domain = settings.COOKIE_DOMAIN,
  46. secure = False,
  47. httponly = False)
  48. response.set_cookie(key = end_user_login_session_key,
  49. value = token,
  50. max_age = 3600 * 24 * 30,
  51. domain = settings.COOKIE_DOMAIN,
  52. secure = False,
  53. httponly = False)
  54. return response