Skip to content

Commit 3a582fc

Browse files
committed
feat: auth profile
1 parent 97f1631 commit 3a582fc

4 files changed

Lines changed: 53 additions & 34 deletions

File tree

‎apps/chat/api/chat_authentication_api.py‎

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def get_response():
3636
pass
3737

3838

39-
class ChatAuthenticationProfileAPI(APIMixin):
39+
class ChatAuthenticationProfileAPIV2(APIMixin):
4040

4141
@staticmethod
4242
def get_parameters():
@@ -49,6 +49,19 @@ def get_parameters():
4949
)]
5050

5151

52+
class ChatAuthenticationProfileAPI(APIMixin):
53+
54+
@staticmethod
55+
def get_parameters():
56+
return [OpenApiParameter(
57+
name="application_id",
58+
description=_("Application ID"),
59+
type=OpenApiTypes.UUID,
60+
location='query',
61+
required=True,
62+
)]
63+
64+
5265
class ChatOpenAPI(APIMixin):
5366
@staticmethod
5467
def get_parameters():

‎apps/chat/serializers/chat_authentication.py‎

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -70,43 +70,49 @@ def auth(self, request, with_valid=True):
7070

7171

7272
class AuthProfileSerializer(serializers.Serializer):
73+
"""v3: 直接通过 application_id 获取认证 profile"""
74+
application_id = serializers.UUIDField(required=True, label=_("application_id"))
75+
76+
def profile(self):
77+
self.is_valid(raise_exception=True)
78+
application_id = self.validated_data.get("application_id")
79+
application_access_token = QuerySet(ApplicationAccessToken).filter(application_id=application_id).first()
80+
if application_access_token is None:
81+
raise NotFound404(404, _("Invalid application_id"))
82+
if not application_access_token.is_active:
83+
raise NotFound404(404, _("Invalid application_id"))
84+
login_value = application_access_token.authentication_value.get('login_value', [])
85+
chat_platform = DatabaseModelManage.get_model('chat_platform')
86+
if chat_platform is not None:
87+
types = QuerySet(chat_platform).filter(is_active=True, is_valid=True).values_list('auth_type', flat=True)
88+
login_value = list(set(login_value) & set(types))
89+
if 'LOCAL' in application_access_token.authentication_value.get('login_value', []):
90+
login_value.insert(0, 'LOCAL')
91+
return {
92+
'application_name': application_access_token.application.name,
93+
'authentication': application_access_token.authentication,
94+
'authentication_type': application_access_token.authentication_value.get('type', 'password'),
95+
'max_attempts': application_access_token.authentication_value.get('max_attempts', 1),
96+
'login_value': login_value,
97+
'rsaKey': get_key_pair_by_sql().get('key')
98+
}
99+
100+
101+
class AuthProfileV2Serializer(serializers.Serializer):
102+
"""v2: 通过 access_token 查表得到 application_id,委托给 AuthProfileSerializer"""
73103
access_token = serializers.CharField(required=True, label=_("access_token"))
74104

75105
def profile(self):
76106
self.is_valid(raise_exception=True)
77-
access_token = self.data.get("access_token")
107+
access_token = self.validated_data.get("access_token")
78108
application_access_token = QuerySet(ApplicationAccessToken).filter(access_token=access_token).first()
79109
if application_access_token is None:
80110
raise NotFound404(404, _("Invalid access_token"))
81111
if not application_access_token.is_active:
82112
raise NotFound404(404, _("Invalid access_token"))
83-
application_id = application_access_token.application_id
84-
profile = {
85-
'authentication': False
86-
}
87-
application_setting_model = DatabaseModelManage.get_model('application_setting')
88-
chat_platform = DatabaseModelManage.get_model('chat_platform')
89-
if application_setting_model and chat_platform:
90-
application_setting = QuerySet(application_setting_model).filter(application_id=application_id).first()
91-
types = QuerySet(chat_platform).filter(is_active=True, is_valid=True).values_list('auth_type', flat=True)
92-
login_value = application_access_token.authentication_value.get('login_value', [])
93-
max_attempts = application_access_token.authentication_value.get('max_attempts', 1)
94-
final_login_value = list(set(login_value) & set(types))
95-
if 'LOCAL' in login_value:
96-
final_login_value.insert(0, 'LOCAL')
97-
if application_setting is not None:
98-
profile = {
99-
'icon': application_setting.application.icon,
100-
'application_name': application_setting.application.name,
101-
'bg_icon': application_setting.chat_background,
102-
'authentication': application_access_token.authentication,
103-
'authentication_type': application_access_token.authentication_value.get(
104-
'type', 'password'),
105-
'max_attempts': max_attempts,
106-
'login_value': final_login_value,
107-
'rsaKey': get_key_pair_by_sql().get('key')
108-
}
109-
return profile
113+
return AuthProfileSerializer(
114+
data={'application_id': application_access_token.application_id}
115+
).profile()
110116

111117

112118
class ApplicationProfileSerializer(serializers.Serializer):

‎apps/chat/views/v2/chat.py‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@
2222
from application.api.application_api import SpeechToTextAPI, TextToSpeechAPI
2323
from application.models import ChatUserType, ChatSourceChoices
2424
from chat.api.chat_api import ChatAPI
25-
from chat.api.chat_authentication_api import ChatAuthenticationAPI, ChatAuthenticationProfileAPI, ChatOpenAPI, OpenAIAPI
25+
from chat.api.chat_authentication_api import ChatAuthenticationAPI, ChatAuthenticationProfileAPIV2, ChatOpenAPI, OpenAIAPI
2626
from chat.serializers.chat import OpenChatSerializers, ChatSerializers, SpeechToTextSerializers, \
2727
TextToSpeechSerializers, OpenAIChatSerializer
2828
from chat.serializers.chat_authentication import AnonymousAuthenticationV2Serializer, ApplicationProfileSerializer, \
29-
AuthProfileSerializer
29+
AuthProfileV2Serializer
3030
from common.auth import ChatTokenAuth
3131
from common.auth.authentication import has_permissions
3232
from common.auth.common import FileToken
@@ -168,13 +168,13 @@ class AuthProfile(APIView):
168168
description=_("Get application authentication information"),
169169
summary=_("Get application authentication information"),
170170
operation_id=_("Get application authentication information"), # type: ignore
171-
parameters=ChatAuthenticationProfileAPI.get_parameters(),
171+
parameters=ChatAuthenticationProfileAPIV2.get_parameters(),
172172
responses=None,
173173
tags=[_('Chat')] # type: ignore
174174
)
175175
def get(self, request: Request):
176176
return result.success(
177-
AuthProfileSerializer(data={'access_token': request.query_params.get("access_token")}).profile())
177+
AuthProfileV2Serializer(data={'access_token': request.query_params.get("access_token")}).profile())
178178

179179

180180
class ChatView(APIView):

‎apps/chat/views/v3/chat.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ class AuthProfile(APIView):
173173
)
174174
def get(self, request: Request):
175175
return result.success(
176-
AuthProfileSerializer(data={'access_token': request.query_params.get("access_token")}).profile())
176+
AuthProfileSerializer(data={'application_id': request.query_params.get("application_id")}).profile())
177177

178178

179179
class ChatView(APIView):

0 commit comments

Comments
 (0)