@@ -200,46 +200,55 @@ def configure_user(self, db_user, bk_user: User):
200200
201201
202202class APIGatewayAuthBackend :
203- """This backend is to be used in conjunction with the ``ApiGatewayJWTUserMiddleware``
204- found in the middleware module of ``apigw_manager`` package.
203+ """Authentication backend for API Gateway JWT validation.
205204
205+ This backend works with `ApiGatewayJWTUserMiddleware` from the
206+ `apigw_manager` package to handle JWT-based authentication.
206207 """
207208
208- def authenticate_with_signature_v3 (self , request , gateway_name , bk_username , verified , ** credentials ):
209- """authenticate function with signature required by ApiGatewayJWTUserMiddleware in apigw_manager == '^3.0.0'"""
210- if not verified :
211- return self .make_anonymous_user (bk_username )
209+ _TOKEN_EXPIRE_TIME = 86400 # 24 hours in seconds
212210
211+ def _create_authenticated_user (self , username : str , provider_type : ProviderType ) -> User :
212+ """Create a user object for authenticated requests."""
213213 return User (
214- token = LoginToken ("any_token" , expires_in = 86400 ),
215- provider_type = self . get_provider_type () ,
216- username = bk_username ,
214+ token = LoginToken ("any_token" , expires_in = self . _TOKEN_EXPIRE_TIME ),
215+ provider_type = provider_type ,
216+ username = username ,
217217 )
218218
219- def authenticate_with_signature_v1 (self , request , api_name , bk_username , verified , ** credentials ) :
220- """authenticate function with signature required by ApiGatewayJWTUserMiddleware in apigw_manager == '^1.0.0' """
221- if not verified :
222- return self .make_anonymous_user (bk_username )
219+ def _authenticate_common (self , verified : bool , username : Optional [ str ]) -> Union [ User , AnonymousUser ] :
220+ """Common authentication logic for all versions. """
221+ if not verified or not username :
222+ return self .make_anonymous_user (username )
223223
224- return User (
225- token = LoginToken ("any_token" , expires_in = 86400 ),
226- provider_type = self .get_provider_type (),
227- username = bk_username ,
228- )
224+ return self ._create_authenticated_user (username = username , provider_type = self .get_provider_type ())
225+
226+ def authenticate_with_signature_v3 (
227+ self , request : HttpRequest , gateway_name : str , bk_username : str , verified : bool , ** credentials : Dict
228+ ) -> Union [User , AnonymousUser ]:
229+ """authenticate function with signature required by ApiGatewayJWTUserMiddleware in apigw_manager == '^3.0.0'"""
230+ return self ._authenticate_common (verified , bk_username )
231+
232+ def authenticate_with_signature_v1 (
233+ self , request : HttpRequest , api_name : str , bk_username : str , verified : bool , ** credentials : Dict
234+ ) -> Union [User , AnonymousUser ]:
235+ """authenticate function with signature required by ApiGatewayJWTUserMiddleware in apigw_manager == '^1.0.0'"""
236+ return self ._authenticate_common (verified , bk_username )
229237
230238 try :
231239 from apigw_manager .apigw .authentication import ApiGatewayJWTUserMiddleware
232240
233- get_user_parameters = sorted ( inspect .signature (ApiGatewayJWTUserMiddleware .get_user ).parameters .keys () )
234- v3_parameters = sorted ( inspect . signature ( authenticate_with_signature_v3 ). parameters . keys ())
235- if get_user_parameters == v3_parameters :
236- authenticate = authenticate_with_signature_v3
237- else :
241+ get_user_parameters = inspect .signature (ApiGatewayJWTUserMiddleware .get_user ).parameters .keys ()
242+ # django 的 authenticate 方法会保证向后兼容参数,调用方新增参数不会影响用户认证(认证只用到了 verified、bk_username 这 2 个参数)
243+ # apigw_manager 的 3.0.0 版本开始 将 api_name 修改为了 gateway_name,导致无法保证向后兼容,所以需要单独处理
244+ # https://github.com/django/django/blob/stable/4.2.x/django/contrib/auth/__init__.py#L69
245+ if "api_name" in get_user_parameters and "gateway_name" not in get_user_parameters :
238246 authenticate = authenticate_with_signature_v1 # type: ignore
247+ else :
248+ authenticate = authenticate_with_signature_v3 # type: ignore
239249 del get_user_parameters
240- del v3_parameters
241250 except ImportError :
242- authenticate = authenticate_with_signature_v1 # type: ignore
251+ authenticate = authenticate_with_signature_v3 # type: ignore
243252
244253 def get_user (self , user_id ):
245254 raise NotImplementedError (
0 commit comments