我已經使用 Rest Framework 實作了一個商店 API 串列,包括用戶 API、產品 API 等。用戶 api 包括基本的登錄/注銷/注冊方法。登錄需要用戶名和密碼,所以 API 呼叫看起來像 requests.post('api/api_user/login', {username='name', password='password'})。Post 方法回傳身份驗證令牌,如下所示: 發布結果
問題是我如何使用我的 API 在 Web 應用程式中處理 @login_required。登錄的想法很直觀,我可以發送 post 請求并獲取可以存盤在 cookie 中的令牌,但是 Django 使用它自己的身份驗證系統來處理用戶在視圖上的登錄(@login_required 裝飾器),所以我留下了獲取令牌的想法從每個請求中的 cookie 并檢查它的正確性,但這樣做是正確的方法嗎?我正在尋找如何實施這件事的示例或建議。
我的 auth api 實作如下:
from django.contrib.auth import login
from knox.views import LoginView as KnoxLoginView, LogoutView as KnoxLogoutView
from rest_framework import permissions, generics, status
from rest_framework.authtoken.serializers import AuthTokenSerializer
from rest_framework.response import Response
from .serializers import UserSerializer, RegisterSerializer, ChangePasswordSerializer
class RegisterAPI(generics.CreateAPIView):
serializer_class = RegisterSerializer
permission_classes = (permissions.AllowAny,)
http_method_names = ['post']
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.save()
return Response({"user": UserSerializer(user, context=self.get_serializer_context()).data}, status=status.HTTP_200_OK)
class LoginAPI(KnoxLoginView):
serializer_class = AuthTokenSerializer
permission_classes = (permissions.AllowAny,)
http_method_names = ['post']
def post(self, request, format=None):
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
login(request, user)
return super(LoginAPI, self).post(request, format=None)
class ChangePasswordAPI(generics.UpdateAPIView):
serializer_class = ChangePasswordSerializer
permission_classes = (permissions.IsAuthenticated,)
http_method_names = ['put']
def get_object(self, queryset=None):
obj = self.request.user
return obj
def update(self, request, *args, **kwargs):
self.object = self.get_object()
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
if not self.object.check_password(serializer.data.get("old_password")):
return Response({"detail": "Wrong old password"}, status=status.HTTP_400_BAD_REQUEST)
self.object.set_password(serializer.data.get("new_password"))
self.object.save()
return Response({'detail': 'Password updated successfully'}, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class LogoutAPI(KnoxLogoutView):
http_method_names = ['post']
uj5u.com熱心網友回復:
默認情況下,Django 需要會話身份驗證。由于您是手動生成令牌,因此您必須手動在每個 API 中對其進行身份驗證。為此,您必須撰寫自定義身份驗證方法來解碼令牌并檢查詳細資訊。
或者
根據DRF檔案,如果您使用了 DRF 身份驗證,則可以使用默認的身份驗證權限類。
uj5u.com熱心網友回復:
Django 身份驗證可用于以下列方式執行查詢,但在您應該登錄并獲取會話 ID 和令牌之前。
ses_id = request.session.session_key
token = get_token(request)
cookies = {'csrftoken': token, 'sessionid': ses_id}
response = requests.get('http://127.0.0.1:8000/api/api_product/product_types/', cookies=cookies)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/357635.html
