我有一个Django Rest Framework API,可通过Firebase进行身份验证。
在用户使用Firebase登录后的前端,会向已验证的后端发送令牌,Firebase会在验证后返回user_id
,这用于返回当前用户。
我编写了一个简单的自定义身份验证类来处理令牌验证。令牌设置为tokenid
标头。这是代码:
from rest_framework.authentication import BaseAuthentication
from rest_framework import exceptions
import firebase_admin
from firebase_admin import credentials, auth
from .models import User
CREDS_PATH = 'PATH_TO_CREDS.json'
cred = credentials.Certificate(CREDS_PATH)
default_app = firebase_admin.initialize_app(cred)
class FirebaseAuthentication(BaseAuthentication):
"""Authenticate the user and get its info from Firebase.
The token is sent in the request as idToken and veryfied with
the Firebase admin.
"""
def authenticate(self, request):
"""Actual authentication happens here."""
token = request.META.get('HTTP_TOKENID')
if token:
try:
firebase_user = auth.verify_id_token(token)
except ValueError:
return None
if not firebase_user:
return None
user_id = firebase_user.get('user_id')
try:
user = User.objects.get(id=user_id)
print(user)
except User.DoesNotExist:
raise exceptions.AuthenticationFailed('No such user')
return (user, None)
else:
# no token provided
return None
然后,我创建了一个与/login
路由相关联且使用FirebaseAuthentication
和SessionAuthentication
的视图。我们的想法是让此端点验证firebase token
并发出CSRF
Cookie。
这是视图类:
class LoginView(views.APIView):
"""Authenticate user.
Authentication with firebase.
"""
authentication_classes = (FirebaseAuthentication, SessionAuthentication)
def post(self, request, format=None):
"""Just redirect to personal profile."""
return Response({"message": "Successful Authentication!"}, status=200)
我通过Postman发出请求,验证成功,但响应中没有cookie。 我不确定如何在成功验证时打开会话。
答案 0 :(得分:-1)
在使用DRF时,您不想使用带有Firebase令牌的会话。使用REST框架的重点是保持无状态。您可以设置客户端代码以验证用户身份,并将用户的ID令牌传递到Django REST Framework后端,该后端会将其视为JWT。 要使用DRF可浏览API或Django管理员,您实际上应该只使用本地Django用户。 我为此编写了一个程序包,该程序包在PyPi上可用:drf-firebase-auth 回购在这里: github.com/garyburgmann/drf-firebase-auth