Reputation: 1
I am trying to bypass django basic auth as I want to use firebase auth on Frontend and I am only getting the id_token on Backend.
The Middleware is as follows:
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
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)
The settings File is as follows:
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',
]
And the view goes like:
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
The issue is that I'm getting request.user an Anonymous User object and the custom headers are also missing in request.
How do I bypass the auth middlewares that do not alter the request ?
I tried rearranging middlewares but it did not work. Also, removing auth middleware is not an option. I am using django admin as well.
Upvotes: 0
Views: 64