# -*- coding: utf-8 -*- # !/usr/bin/env python import datetime import logging import time from django.conf import settings from typing import Optional, TYPE_CHECKING from apps.web.user.models import MyUser from apps.web.utils import trace_call from middlewares.django_jwt_session_auth import jwt_login, jwt_session_key if TYPE_CHECKING: from django.http.request import HttpRequest from django.http.response import HttpResponseRedirect logger = logging.getLogger(__name__) def user_to_payload(user): # type: (MyUser)->dict exp = datetime.datetime.now() + datetime.timedelta(seconds = 3600 * 24 * 30) return { 'user_id': str(user.id), 'iat': int(time.time()), 'exp': exp } def payload_to_user(payload): # type: (dict)->Optional[MyUser] if not payload: return None user_id = payload.get('user_id') try: user = MyUser.objects.get(id = user_id) except: user = None return user def end_user_login(request, user): # type:(HttpRequest, MyUser)->str return jwt_login(settings.SERVICE_DOMAIN.USER, user, request) end_user_login_session_key = jwt_session_key(settings.SERVICE_DOMAIN.USER) @trace_call(logger = logger) def response_with_login(request, user, response): # type:(HttpRequest, MyUser, HttpResponseRedirect)->HttpResponseRedirect token = end_user_login(request, user) logger.debug("{} login in.".format(repr(user))) response.set_cookie(key = settings.JWT_AUTH_DOMAIN_COOKIE_NAME, value = settings.SERVICE_DOMAIN.USER, max_age = 3600 * 24 * 30, domain = settings.COOKIE_DOMAIN, secure = False, httponly = False) response.set_cookie(key = end_user_login_session_key, value = token, max_age = 3600 * 24 * 30, domain = settings.COOKIE_DOMAIN, secure = False, httponly = False) return response