在Django Rest Framework中创建一个会话

时间:2018-03-12 17:59:22

标签: django firebase django-rest-framework

我有一个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路由相关联且使用FirebaseAuthenticationSessionAuthentication的视图。我们的想法是让此端点验证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。 我不确定如何在成功验证时打开会话。

1 个答案:

答案 0 :(得分:-1)

在使用DRF时,您不想使用带有Firebase令牌的会话。使用REST框架的重点是保持无状态。您可以设置客户端代码以验证用户身份,并将用户的ID令牌传递到Django REST Framework后端,该后端会将其视为JWT。 要使用DRF可浏览API或Django管理员,您实际上应该只使用本地Django用户。 我为此编写了一个程序包,该程序包在PyPi上可用:drf-firebase-auth 回购在这里: github.com/garyburgmann/drf-firebase-auth