Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion apps/chat/api/chat_authentication_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def get_response():
pass


class ChatAuthenticationProfileAPI(APIMixin):
class ChatAuthenticationProfileAPIV2(APIMixin):

@staticmethod
def get_parameters():
Expand All @@ -49,6 +49,19 @@ def get_parameters():
)]


class ChatAuthenticationProfileAPI(APIMixin):

@staticmethod
def get_parameters():
return [OpenApiParameter(
name="application_id",
description=_("Application ID"),
type=OpenApiTypes.UUID,
location='query',
required=True,
)]


class ChatOpenAPI(APIMixin):
@staticmethod
def get_parameters():
Expand Down
62 changes: 34 additions & 28 deletions apps/chat/serializers/chat_authentication.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,43 +70,49 @@ def auth(self, request, with_valid=True):


class AuthProfileSerializer(serializers.Serializer):
"""v3: 直接通过 application_id 获取认证 profile"""
application_id = serializers.UUIDField(required=True, label=_("application_id"))

def profile(self):
self.is_valid(raise_exception=True)
application_id = self.validated_data.get("application_id")
application_access_token = QuerySet(ApplicationAccessToken).filter(application_id=application_id).first()
if application_access_token is None:
raise NotFound404(404, _("Invalid application_id"))
if not application_access_token.is_active:
raise NotFound404(404, _("Invalid application_id"))
login_value = application_access_token.authentication_value.get('login_value', [])
chat_platform = DatabaseModelManage.get_model('chat_platform')
if chat_platform is not None:
types = QuerySet(chat_platform).filter(is_active=True, is_valid=True).values_list('auth_type', flat=True)
login_value = list(set(login_value) & set(types))
if 'LOCAL' in application_access_token.authentication_value.get('login_value', []):
login_value.insert(0, 'LOCAL')
return {
'application_name': application_access_token.application.name,
'authentication': application_access_token.authentication,
'authentication_type': application_access_token.authentication_value.get('type', 'password'),
'max_attempts': application_access_token.authentication_value.get('max_attempts', 1),
'login_value': login_value,
'rsaKey': get_key_pair_by_sql().get('key')
}


class AuthProfileV2Serializer(serializers.Serializer):
"""v2: 通过 access_token 查表得到 application_id,委托给 AuthProfileSerializer"""
access_token = serializers.CharField(required=True, label=_("access_token"))

def profile(self):
self.is_valid(raise_exception=True)
access_token = self.data.get("access_token")
access_token = self.validated_data.get("access_token")
application_access_token = QuerySet(ApplicationAccessToken).filter(access_token=access_token).first()
if application_access_token is None:
raise NotFound404(404, _("Invalid access_token"))
if not application_access_token.is_active:
raise NotFound404(404, _("Invalid access_token"))
application_id = application_access_token.application_id
profile = {
'authentication': False
}
application_setting_model = DatabaseModelManage.get_model('application_setting')
chat_platform = DatabaseModelManage.get_model('chat_platform')
if application_setting_model and chat_platform:
application_setting = QuerySet(application_setting_model).filter(application_id=application_id).first()
types = QuerySet(chat_platform).filter(is_active=True, is_valid=True).values_list('auth_type', flat=True)
login_value = application_access_token.authentication_value.get('login_value', [])
max_attempts = application_access_token.authentication_value.get('max_attempts', 1)
final_login_value = list(set(login_value) & set(types))
if 'LOCAL' in login_value:
final_login_value.insert(0, 'LOCAL')
if application_setting is not None:
profile = {
'icon': application_setting.application.icon,
'application_name': application_setting.application.name,
'bg_icon': application_setting.chat_background,
'authentication': application_access_token.authentication,
'authentication_type': application_access_token.authentication_value.get(
'type', 'password'),
'max_attempts': max_attempts,
'login_value': final_login_value,
'rsaKey': get_key_pair_by_sql().get('key')
}
return profile
return AuthProfileSerializer(
data={'application_id': application_access_token.application_id}
).profile()


class ApplicationProfileSerializer(serializers.Serializer):
Expand Down
8 changes: 4 additions & 4 deletions apps/chat/views/v2/chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@
from application.api.application_api import SpeechToTextAPI, TextToSpeechAPI
from application.models import ChatUserType, ChatSourceChoices
from chat.api.chat_api import ChatAPI
from chat.api.chat_authentication_api import ChatAuthenticationAPI, ChatAuthenticationProfileAPI, ChatOpenAPI, OpenAIAPI
from chat.api.chat_authentication_api import ChatAuthenticationAPI, ChatAuthenticationProfileAPIV2, ChatOpenAPI, OpenAIAPI
from chat.serializers.chat import OpenChatSerializers, ChatSerializers, SpeechToTextSerializers, \
TextToSpeechSerializers, OpenAIChatSerializer
from chat.serializers.chat_authentication import AnonymousAuthenticationV2Serializer, ApplicationProfileSerializer, \
AuthProfileSerializer
AuthProfileV2Serializer
from common.auth import ChatTokenAuth
from common.auth.authentication import has_permissions
from common.auth.common import FileToken
Expand Down Expand Up @@ -168,13 +168,13 @@ class AuthProfile(APIView):
description=_("Get application authentication information"),
summary=_("Get application authentication information"),
operation_id=_("Get application authentication information"), # type: ignore
parameters=ChatAuthenticationProfileAPI.get_parameters(),
parameters=ChatAuthenticationProfileAPIV2.get_parameters(),
responses=None,
tags=[_('Chat')] # type: ignore
)
def get(self, request: Request):
return result.success(
AuthProfileSerializer(data={'access_token': request.query_params.get("access_token")}).profile())
AuthProfileV2Serializer(data={'access_token': request.query_params.get("access_token")}).profile())


class ChatView(APIView):
Expand Down
2 changes: 1 addition & 1 deletion apps/chat/views/v3/chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ class AuthProfile(APIView):
)
def get(self, request: Request):
return result.success(
AuthProfileSerializer(data={'access_token': request.query_params.get("access_token")}).profile())
AuthProfileSerializer(data={'application_id': request.query_params.get("application_id")}).profile())


class ChatView(APIView):
Expand Down
Loading