簡體   English   中英

Django - 讓用戶在每次 REST API 呼叫時登錄身份驗證檢查

[英]Django - Have a user logged in authentication check on every REST API call

我在 Django 中有 2 個視圖的代碼。您會注意到每個 REST API 調用都有一個 verify_login() function 調用,確保請求包含經過驗證的 JWT 令牌。 我想知道是否有更好的方法來實現這一點,這樣我就不必在每個 REST 端點中專門設置這些行

    verify_response = verify_login(request)
    if verify_response not None:
        return verify_response

我正在嘗試遵循 D.R.Y。 (Do Not Repeat Yourself) 編碼原則。 如果有一種更簡潔的方式來表示這一點,那就太好了。 我考慮過可能創建一個擴展 APIView 的模塊,它自動擁有這個,然后我所有的視圖都擴展那個,但是遇到了必須調用 super().API_REQUEST() 然后必須執行相同的 if 語句檢查才能看到的問題是否為 None。

class PostView(APIView):
    """
    View for Post object

    * requires token authentication
    """
    # Create post
    @swagger_auto_schema(
        request_body=PostSerializer,
        operation_description="Create a post object"
    )
    def post(self, request):
        verify_response = verify_login(request)
        if verify_response not None:
            return verify_response

        serializer = PostSerializer(data=request.data)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    # get all posts
    @swagger_auto_schema(
        operation_description="Get all posts from the DB"
    )
    def get(self, request):
        verify_response = verify_login(request)
        if verify_response not None:
            return verify_response

        posts = Post.objects.all()
        serializer = PostSerializer(posts, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

您可以將身份驗證類與權限類一起使用。 如果您希望對應用程序的所有 API 進行身份驗證檢查,請將您的類放在 settings.REST_FRAMEWORK 中。 如果你想要它用於特定的 APIView,請將它們放在 permission_classes & authentication_classes class 變量中。 查看文檔以獲取更多詳細信息。

例子,

class JWTAuthenticataion(BaseAuthentication):
    def authenticate(self, request):
        ...    # write your JWT implementation here


# settings.py:
REST_FRAMEWORK = {
    ...
    "DEFAULT_AUTHENTICATION_CLASSES": (
        "path.to.JWTAuthentication",
    ),
    "DEFAULT_PERMISSION_CLASSES": (
        "rest_framework.permissions.IsAuthenticated",
    )
}

# or
# api.py
class YourAPIView(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (JWTAuthentication, )

    ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM