Cách triển khai lược đồ xác thực tùy chỉnh trong DRF?
Để triển khai giao thức xác thực tùy chỉnh, chúng tôi cần phân lớp lớp DRF's BaseAuthentication
và ghi đè phương thức .authenticate(self, request)
.
Phương thức sẽ trả về hai bộ gồm (user, auth)
nếu xác thực thành công hoặc None
nếu không. Trong một số trường hợp, chúng tôi có thể nêu một ngoại lệ AuthenticationFailed
từ phương thức .authenticate()
.
Ví dụ (từ DRF docs):
phép nói rằng chúng tôi muốn xác nhận bất cứ yêu cầu đến như là người dùng được đưa ra bởi username
trong một tiêu đề yêu cầu tùy chỉnh tên 'X_USERNAME'
.
Bước 1: Tạo lớp xác thực Tuỳ chỉnh
Để làm điều đó, chúng ta sẽ tạo một tập tin authentication.py
trong my_app
.
# my_app/authentication.py
from django.contrib.auth.models import User
from rest_framework import authentication
from rest_framework import exceptions
class ExampleAuthentication(authentication.BaseAuthentication):
def authenticate(self, request):
username = request.META.get('X_USERNAME') # get the username request header
if not username: # no username passed in request headers
return None # authentication did not succeed
try:
user = User.objects.get(username=username) # get the user
except User.DoesNotExist:
raise exceptions.AuthenticationFailed('No such user') # raise exception if user does not exist
return (user, None) # authentication successful
Bước 2: Xác định lớp xác thực tùy chỉnh
Sau khi tạo lớp thẩm định tùy chỉnh, chúng ta cần phải xác định lớp xác thực này trong cài đặt DRF của chúng tôi. Làm điều này, tất cả các yêu cầu sẽ được xác thực dựa trên lược đồ xác thực này.
'DEFAULT_AUTHENTICATION_CLASSES': (
'my_app.authentication.ExampleAuthentication', # custom authentication class
...
),
Lưu ý: Nếu bạn muốn sử dụng này lớp xác thực tùy chỉnh trên cơ sở per-view hoặc mỗi viewset cơ sở và không phải trên cấp độ toàn cầu, bạn có thể định nghĩa lớp xác thực này một cách rõ ràng trong quan điểm của bạn.
class MyView(APIView):
authentication_classes = (ExampleAuthentication,) # specify this authentication class in your view
...
bạn có thể xin vui lòng cho một ví dụ về cách sử dụng này sử dụng curl? – momokjaaaaa
@momokjaaaaa Kiểm tra liên kết SO này để gửi tiêu đề trong yêu cầu POST. http://stackoverflow.com/questions/356705/how-to-send-a-header-using-a-http-request-through-a-curl-call –