chat_authentication.py 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. # coding=utf-8
  2. """
  3. @project: MaxKB
  4. @Author:虎虎
  5. @file: ChatAuthentication.py
  6. @date:2025/6/6 13:48
  7. @desc:
  8. """
  9. import uuid_utils.compat as uuid
  10. from django.core import signing
  11. from django.core.cache import cache
  12. from django.db.models import QuerySet
  13. from django.utils.translation import gettext_lazy as _
  14. from rest_framework import serializers
  15. from application.models import ApplicationAccessToken, ChatUserType, Application, ApplicationVersion
  16. from application.serializers.application import ApplicationSerializerModel
  17. from common.auth.common import ChatUserToken, ChatAuthentication
  18. from common.constants.authentication_type import AuthenticationType
  19. from common.constants.cache_version import Cache_Version
  20. from common.database_model_manage.database_model_manage import DatabaseModelManage
  21. from common.exception.app_exception import NotFound404, AppUnauthorizedFailed
  22. from common.utils.rsa_util import get_key_pair_by_sql
  23. class AnonymousAuthenticationSerializer(serializers.Serializer):
  24. access_token = serializers.CharField(required=True, label=_("access_token"))
  25. def auth(self, request, with_valid=True):
  26. token = request.META.get('HTTP_AUTHORIZATION')
  27. token_details = {}
  28. try:
  29. # 校验token
  30. if token is not None:
  31. token_details = signing.loads(token[7:])
  32. except Exception as e:
  33. pass
  34. if with_valid:
  35. self.is_valid(raise_exception=True)
  36. access_token = self.data.get("access_token")
  37. application_access_token = QuerySet(ApplicationAccessToken).filter(access_token=access_token).first()
  38. if application_access_token is not None and application_access_token.is_active:
  39. chat_user_id = token_details.get('chat_user_id') or str(uuid.uuid7())
  40. _type = AuthenticationType.CHAT_ANONYMOUS_USER
  41. return ChatUserToken(application_access_token.application_id, None, access_token, _type,
  42. ChatUserType.ANONYMOUS_USER,
  43. chat_user_id, ChatAuthentication(None)).to_token()
  44. else:
  45. raise NotFound404(404, _("Invalid access_token"))
  46. class AuthProfileSerializer(serializers.Serializer):
  47. access_token = serializers.CharField(required=True, label=_("access_token"))
  48. def profile(self):
  49. self.is_valid(raise_exception=True)
  50. access_token = self.data.get("access_token")
  51. application_access_token = QuerySet(ApplicationAccessToken).filter(access_token=access_token).first()
  52. if application_access_token is None:
  53. raise NotFound404(404, _("Invalid access_token"))
  54. if not application_access_token.is_active:
  55. raise NotFound404(404, _("Invalid access_token"))
  56. application_id = application_access_token.application_id
  57. profile = {
  58. 'authentication': False
  59. }
  60. application_setting_model = DatabaseModelManage.get_model('application_setting')
  61. chat_platform = DatabaseModelManage.get_model('chat_platform')
  62. if application_setting_model and chat_platform:
  63. application_setting = QuerySet(application_setting_model).filter(application_id=application_id).first()
  64. types = QuerySet(chat_platform).filter(is_active=True, is_valid=True).values_list('auth_type', flat=True)
  65. login_value = application_access_token.authentication_value.get('login_value', [])
  66. max_attempts = application_access_token.authentication_value.get('max_attempts', 1)
  67. final_login_value = list(set(login_value) & set(types))
  68. if 'LOCAL' in login_value:
  69. final_login_value.insert(0, 'LOCAL')
  70. if application_setting is not None:
  71. profile = {
  72. 'icon': application_setting.application.icon,
  73. 'application_name': application_setting.application.name,
  74. 'bg_icon': application_setting.chat_background,
  75. 'authentication': application_access_token.authentication,
  76. 'authentication_type': application_access_token.authentication_value.get(
  77. 'type', 'password'),
  78. 'max_attempts': max_attempts,
  79. 'login_value': final_login_value,
  80. 'rsaKey' : get_key_pair_by_sql().get('key')
  81. }
  82. return profile
  83. class ApplicationProfileSerializer(serializers.Serializer):
  84. application_id = serializers.UUIDField(required=True, label=_("Application ID"))
  85. @staticmethod
  86. def reset_application(application, application_version):
  87. update_field_dict = {
  88. 'application_name': 'name', 'desc': 'desc', 'prologue': 'prologue', 'dialogue_number': 'dialogue_number',
  89. 'user_id': 'user_id', 'model_id': 'model_id', 'knowledge_setting': 'knowledge_setting',
  90. 'model_setting': 'model_setting', 'model_params_setting': 'model_params_setting',
  91. 'tts_model_params_setting': 'tts_model_params_setting',
  92. 'problem_optimization': 'problem_optimization', 'work_flow': 'work_flow',
  93. 'problem_optimization_prompt': 'problem_optimization_prompt', 'tts_model_id': 'tts_model_id',
  94. 'stt_model_id': 'stt_model_id', 'tts_model_enable': 'tts_model_enable',
  95. 'stt_model_enable': 'stt_model_enable', 'tts_type': 'tts_type',
  96. 'tts_autoplay': 'tts_autoplay', 'stt_autosend': 'stt_autosend', 'file_upload_enable': 'file_upload_enable',
  97. 'file_upload_setting': 'file_upload_setting'
  98. }
  99. for (version_field, app_field) in update_field_dict.items():
  100. _v = getattr(application_version, version_field)
  101. setattr(application, app_field, _v)
  102. def profile(self, with_valid=True):
  103. if with_valid:
  104. self.is_valid()
  105. application_id = self.data.get("application_id")
  106. application = QuerySet(Application).get(id=application_id)
  107. application_access_token = QuerySet(ApplicationAccessToken).filter(application_id=application.id).first()
  108. if application_access_token is None:
  109. raise AppUnauthorizedFailed(500, _("Illegal User"))
  110. application_setting_model = DatabaseModelManage.get_model('application_setting')
  111. application_version = QuerySet(ApplicationVersion).filter(application_id=application.id).order_by(
  112. '-create_time').first()
  113. if application_version is not None:
  114. self.reset_application(application, application_version)
  115. license_is_valid = cache.get(Cache_Version.SYSTEM.get_key(key='license_is_valid'),
  116. version=Cache_Version.SYSTEM.get_version())
  117. application_setting_dict = {}
  118. if application_setting_model is not None and license_is_valid:
  119. application_setting = QuerySet(application_setting_model).filter(
  120. application_id=application_access_token.application_id).first()
  121. if application_setting is not None:
  122. custom_theme = getattr(application_setting, 'custom_theme', {})
  123. float_location = getattr(application_setting, 'float_location', {})
  124. if not custom_theme:
  125. application_setting.custom_theme = {
  126. 'theme_color': '',
  127. 'header_font_color': ''
  128. }
  129. if not float_location:
  130. application_setting.float_location = {
  131. 'x': {'type': '', 'value': ''},
  132. 'y': {'type': '', 'value': ''}
  133. }
  134. application_setting_dict = {'show_source': application_access_token.show_source,
  135. 'show_history': application_setting.show_history,
  136. 'draggable': application_setting.draggable,
  137. 'show_guide': application_setting.show_guide,
  138. 'avatar': application_setting.avatar,
  139. 'show_avatar': application_setting.show_avatar,
  140. 'float_icon': application_setting.float_icon,
  141. 'disclaimer': application_setting.disclaimer,
  142. 'disclaimer_value': application_setting.disclaimer_value,
  143. 'custom_theme': application_setting.custom_theme,
  144. 'user_avatar': application_setting.user_avatar,
  145. 'show_user_avatar': application_setting.show_user_avatar,
  146. 'float_location': application_setting.float_location,
  147. 'chat_background': application_setting.chat_background}
  148. base_node = [node for node in ((application.work_flow or {}).get('nodes', []) or []) if
  149. node.get('id') == 'base-node']
  150. return {**ApplicationSerializerModel(application).data,
  151. 'stt_model_id': application.stt_model_id,
  152. 'tts_model_id': application.tts_model_id,
  153. 'stt_model_enable': application.stt_model_enable,
  154. 'tts_model_enable': application.tts_model_enable,
  155. 'tts_type': application.tts_type,
  156. 'tts_autoplay': application.tts_autoplay,
  157. 'stt_autosend': application.stt_autosend,
  158. 'file_upload_enable': application.file_upload_enable,
  159. 'file_upload_setting': application.file_upload_setting,
  160. 'work_flow': {'nodes': base_node} if base_node else None,
  161. 'show_source': application_access_token.show_source,
  162. 'show_exec': application_access_token.show_exec,
  163. 'language': application_access_token.language,
  164. **application_setting_dict}