ByPass Django Basic Auth
Я пытаюсь обойти django basic auth, так как хочу использовать firebase auth на Frontend и получаю только id_token на Backend.
Среднее программное обеспечение выглядит следующим образом:
class FireBaseAuth(MiddlewareMixin):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
modified_request = self.process_request(request)
response = self.get_response(modified_request)
response = self.process_response(response)
return response
def process_request(self, request):
middleware = "[FireBase Auth]"
logger.info(f"{middleware} Request path: {request.path}")
if request.path.rstrip('/').split('/')[-1] in EXCLUDE_AUTH_ENDPOINTS:
logger.info(
f"{middleware} Skipping auth check for: {request.path}")
return request
user = User.objects.filter(email='lahiwe@pelagius.net').first()
request.user = user
return request
token = request.META.get("HTTP_FB_ACCESS_TOKEN")
if not token:
logger.info(f"{middleware} No token found")
return HttpResponse("Unauthorized",
status=status.HTTP_401_UNAUTHORIZED)
# check if token is valid
try:
fb_user = auth.verify_id_token(token)
if not fb_user:
logger.info(f"{middleware} No info found against token")
return HttpResponse("Unauthorized",
status=status.HTTP_401_UNAUTHORIZED)
if fb_user:
# Fetch user Data
fb_user = auth.get_user_by_email(fb_user['email'])
if not fb_user.email_verified:
logger.info(f"{middleware} User email not verified")
return HttpResponse("User email not verified",
status=status.HTTP_401_UNAUTHORIZED)
logger.info(
f"{middleware} Got user[{fb_user.email}] from firebase")
# Check if user exists in current region
user = User.objects.filter(email=fb_user.email).first()
# Create user if not exists
if not user:
logger.info(f"{middleware} User not Found")
return HttpResponse("User email not Found",status=status.HTTP_400_BAD_REQUEST)
logger.info(f"{middleware} User Found. {user.id}")
request.user = user
setattr(request, 'user', user)
logger.info(f"{middleware} Updated request user")
return request
except Exception as e:
exec_type, exce_value, exec_traceback = sys.exc_info()
logging.error(
repr(traceback.format_exception(exec_type,exce_value,exec_traceback)))
return HttpResponse(f"Unauthorized. "f"{'Token Expired' if 'expired' in str(e) else 'Invalid Token' }",status=status.HTTP_401_UNAUTHORIZED)
Файл настроек выглядит следующим образом:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.security.SecurityMiddleware',
'ts.middleware.AddSecurityHeadersMiddleware',
'ts.middleware.FireBaseAuth',
]
И вид получается такой:
class GetUserAPIView(APIView):
"""
Get user data
"""
# authentication_classes = [JWTAuthentication]
# permission_classes = [IsAuthenticated]
def get(self, request):
"""
Return data of user
:param request: get request
"""
api_name = " [GET: user/get_user_data] "
try:
# device_token = request.query_params.get('device_token', "")
# device_type = request.query_params.get('device_type', "")
user = request.user
............. and goes on
Проблема в том, что я получаю request.user объект Anonymous User и пользовательские заголовки также отсутствуют в request.
Как обойти посредников, которые не изменяют запрос?
Я пробовал переставлять промежуточные модули, но это не помогло. Также удаление промежуточного ПО auth не является вариантом. Я также использую django admin.