Professional Documents
Culture Documents
Xác Thực - Khung Django REST
Xác Thực - Khung Django REST
Xác thực
Ví dụ
Gói của bên thứ ba
django-rest-knox
Bộ công cụ Django OAuth
OAuth khung Django REST
Xác thực mã thông báo web JSON
Xác thực HTTP Hawk
Xác thực chữ ký HTTP
Djoser
django-rest-auth / dj-rest-auth
drf-xã hội-oauth2
xác thực.py
Xác thực
“
Auth cần phải có khả năng cắm được.
- Jacob Kaplan-Moss, "Các phương pháp tồi tệ nhất về REST"
Xác thực là cơ chế liên kết một yêu cầu đến với một tập hợp thông tin xác thực nhận dạng, chẳng hạn như
người dùng gửi yêu cầu hoặc mã thông báo mà yêu cầu đó được ký. Sau đó, các chính sách về quyền và điều
chỉnh có thể sử dụng các thông tin xác thực đó để xác định xem yêu cầu có được phép hay không.
Khung REST cung cấp một số lược đồ xác thực ngay lập tức và cũng cho phép bạn triển khai các lược đồ tùy
chỉnh.
Quá trình xác thực luôn chạy ngay từ đầu chế độ xem, trước khi diễn ra quá trình kiểm tra quyền và điều tiết
cũng như trước khi bất kỳ mã nào khác được phép tiếp tục.
Thuộc request.user tính thường sẽ được đặt thành một phiên bản của lớp contrib.auth của gói User .
Thuộc request.auth tính được sử dụng cho bất kỳ thông tin xác thực bổ sung nào, ví dụ: nó có thể được sử
dụng để thể hiện mã thông báo xác thực mà yêu cầu đã được ký.
Lưu ý: Đừng quên rằng bản thân việc xác thực sẽ không cho phép hoặc không cho phép một yêu cầu gửi đến
, nó chỉ xác định thông tin xác thực mà yêu cầu được thực hiện.
Để biết thông tin về cách thiết lập chính sách cấp phép cho API của bạn, vui lòng xem tài liệu về quyền .
Nếu không có lớp nào xác thực, request.user nó sẽ được đặt thành một phiên bản của
django.contrib.auth.models.AnonymousUser , và request.auth sẽ được đặt thành None .
Giá trị của request.user và request.auth đối với các yêu cầu chưa được xác thực có thể được sửa đổi
bằng cách sử dụng cài đặt UNAUTHENTICATED_USER và UNAUTHENTICATED_TOKEN .
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
]
}
Bạn cũng có thể đặt lược đồ xác thực trên cơ sở mỗi chế độ xem hoặc mỗi chế độ xem bằng cách sử dụng
chế APIView độ xem dựa trên lớp.
class ExampleView(APIView):
authentication_classes = [SessionAuthentication, BasicAuthentication]
permission_classes = [IsAuthenticated]
@api_view(['GET'])
@authentication_classes([SessionAuthentication, BasicAuthentication])
@permission_classes([IsAuthenticated])
def example_view(request, format=None):
content = {
'user': str(request.user), # `django.contrib.auth.User` instance.
'auth': str(request.auth), # None
}
return Response(content)
Phản hồi HTTP 401 phải luôn bao gồm WWW-Authenticate tiêu đề hướng dẫn khách hàng cách xác thực.
Phản hồi HTTP 403 không bao gồm WWW-Authenticate tiêu đề.
Loại phản hồi sẽ được sử dụng tùy thuộc vào sơ đồ xác thực. Mặc dù có thể sử dụng nhiều sơ đồ xác thực
nhưng chỉ có thể sử dụng một sơ đồ để xác định loại phản hồi. Lớp xác thực đầu tiên được đặt trên dạng
xem được sử dụng khi xác định loại phản hồi .
Lưu ý rằng khi một yêu cầu có thể xác thực thành công nhưng vẫn bị từ chối cấp phép thực hiện yêu cầu,
trong trường hợp đó, phản 403 Permission Denied hồi sẽ luôn được sử dụng, bất kể sơ đồ xác thực.
Nếu bạn đang triển khai lên Apache và sử dụng bất kỳ xác thực không dựa trên phiên nào, bạn sẽ cần định
cấu hình rõ ràng mod_wsgi để chuyển các tiêu đề bắt buộc tới ứng dụng. Điều này có thể được thực hiện
bằng cách chỉ định WSGIPassAuthorization lệnh trong ngữ cảnh thích hợp và đặt nó thành 'On' .
Các phản hồi không được xác thực bị từ chối cấp phép sẽ dẫn đến HTTP 401 Unauthorized phản hồi có
tiêu đề WWW-Authenticate thích hợp. Ví dụ:
Lưu ý: Nếu sử dụng BasicAuthentication trong sản xuất, bạn phải đảm bảo rằng API của bạn chỉ khả
dụng trên https . Bạn cũng nên đảm bảo rằng ứng dụng khách API của bạn sẽ luôn yêu cầu lại tên người
dùng và mật khẩu khi đăng nhập và sẽ không bao giờ lưu trữ những chi tiết đó vào bộ lưu trữ liên tục.
Lưu ý: Xác thực mã thông báo do khung Django REST cung cấp là cách triển khai khá đơn giản.
Để biết cách triển khai cho phép nhiều mã thông báo cho mỗi người dùng, có một số chi tiết triển khai bảo
mật chặt chẽ hơn và hỗ trợ hết hạn mã thông báo, vui lòng xem gói bên thứ ba Django REST Knox .
Lược đồ xác thực này sử dụng lược đồ Xác thực HTTP dựa trên mã thông báo đơn giản. Xác thực mã thông
báo thích hợp cho các thiết lập máy khách-máy chủ, chẳng hạn như máy tính để bàn gốc và máy khách di
động.
Để sử dụng TokenAuthentication lược đồ này, bạn cần phải định cấu hình các lớp xác thực để bao gồm
TokenAuthentication và đưa thêm rest_framework.authtoken vào cài đặt của mình
INSTALLED_APPS :
INSTALLED_APPS = [
...
'rest_framework.authtoken'
]
Đảm bảo chạy manage.py migrate sau khi thay đổi cài đặt của bạn.
Ứng dụng này rest_framework.authtoken cung cấp khả năng di chuyển cơ sở dữ liệu Django.
Bạn cũng sẽ cần tạo mã thông báo cho người dùng của mình.
token = Token.objects.create(user=...)
print(token.key)
Để khách hàng xác thực, khóa mã thông báo phải được đưa vào Authorization tiêu đề HTTP. Khóa phải
được bắt đầu bằng chuỗi ký tự "Mã thông báo", với khoảng trắng ngăn cách hai chuỗi. Ví dụ:
Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b
Nếu bạn muốn sử dụng một từ khóa khác trong tiêu đề, chẳng hạn như Bearer , chỉ cần phân lớp
TokenAuthentication và đặt keyword biến lớp.
Nếu được xác thực thành công, TokenAuthentication hãy cung cấp thông tin xác thực sau.
Các phản hồi không được xác thực bị từ chối cấp phép sẽ dẫn đến HTTP 401 Unauthorized phản hồi có
tiêu đề WWW-Authenticate thích hợp. Ví dụ:
WWW-Authenticate: Token
Công curl cụ dòng lệnh có thể hữu ích để kiểm tra các API được xác thực bằng mã thông báo. Ví dụ:
Lưu ý: Nếu sử dụng TokenAuthentication trong sản xuất, bạn phải đảm bảo rằng API của bạn chỉ khả
dụng trên https .
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)
Lưu ý rằng bạn sẽ muốn đảm bảo đặt đoạn mã này vào models.py mô-đun đã cài đặt hoặc một số vị trí
khác sẽ được Django nhập khi khởi động.
Nếu bạn đã tạo một số người dùng, bạn có thể tạo mã thông báo cho tất cả người dùng hiện tại như thế này:
from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token
Lưu ý rằng phần URL của mẫu có thể là bất cứ thứ gì bạn muốn sử dụng.
Chế obtain_auth_token độ xem sẽ trả về phản hồi JSON khi hợp lệ username và password các trường
được ĐĂNG tới chế độ xem bằng dữ liệu biểu mẫu hoặc JSON:
{ 'token' : '9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b' }
Lưu ý rằng chế obtain_auth_token độ xem mặc định sử dụng rõ ràng các yêu cầu và phản hồi JSON, thay
vì sử dụng các lớp trình phân tích cú pháp và trình kết xuất mặc định trong cài đặt của bạn.
Theo mặc định, không có quyền hoặc điều chỉnh nào được áp dụng cho chế obtain_auth_token độ xem.
Nếu bạn muốn áp dụng điều chỉnh, bạn sẽ cần ghi đè lớp chế độ xem và đưa chúng vào bằng
throttle_classes thuộc tính.
Nếu bạn cần một phiên bản tùy chỉnh của chế độ obtain_auth_token xem, bạn có thể làm như vậy bằng
cách phân lớp ObtainAuthToken lớp chế độ xem và thay vào đó sử dụng phiên bản đó trong conf url của
bạn.
Ví dụ: bạn có thể trả về thông tin người dùng bổ sung vượt quá token giá trị:
class CustomAuthToken(ObtainAuthToken):
Và trong urls.py :
urlpatterns += [
path('api-token-auth/', CustomAuthToken.as_view())
]
your_app/admin.py :
TokenAdmin.raw_id_fields = ['user']
lệnh này sẽ trả về mã thông báo API cho người dùng nhất định, tạo mã thông báo đó nếu nó không tồn tại:
Trong trường hợp bạn muốn tạo lại mã thông báo (ví dụ: nếu nó đã bị xâm phạm hoặc bị rò rỉ), bạn có thể
chuyển một tham số bổ sung:
Phản hồi không được xác thực bị từ chối cấp phép sẽ dẫn đến HTTP 403 Forbidden phản hồi.
Nếu bạn đang sử dụng API kiểu AJAX với SessionAuthentication, bạn cần đảm bảo rằng bạn bao gồm mã
thông báo CSRF hợp lệ cho bất kỳ lệnh gọi phương thức HTTP "không an toàn" nào, chẳng hạn như ,
PUT hoặc yêu cầu. Xem tài liệu Django CSRF để biết thêm chi tiết. PATCH POST DELETE
Cảnh báo : Luôn sử dụng chế độ xem đăng nhập tiêu chuẩn của Django khi tạo trang đăng nhập. Điều này sẽ
đảm bảo lượt xem đăng nhập của bạn được bảo vệ đúng cách.
Xác thực CSRF trong khung REST hoạt động hơi khác so với Django tiêu chuẩn do cần hỗ trợ cả xác thực dựa
trên phiên và không dựa trên phiên cho cùng một chế độ xem. Điều này có nghĩa là chỉ những yêu cầu được
xác thực mới yêu cầu mã thông báo CSRF và các yêu cầu ẩn danh có thể được gửi mà không cần mã thông
báo CSRF. Hành vi này không phù hợp với chế độ xem đăng nhập, vốn phải luôn được áp dụng xác thực CSRF.
Nếu được xác thực thành công, RemoteUserAuthentication hãy cung cấp thông tin xác thực sau:
Tham khảo tài liệu trên máy chủ web của bạn để biết thông tin về cách định cấu hình phương thức xác thực,
ví dụ:
Trong một số trường hợp thay vì quay lại None , bạn có thể muốn đưa ra một
AuthenticationFailed ngoại lệ khỏi .authenticate() phương thức.
Thông thường, cách tiếp cận bạn nên thực hiện là:
Nếu không thử xác thực, hãy trả về None . Bất kỳ chương trình xác thực nào khác cũng đang được sử
dụng sẽ vẫn được kiểm tra.
Nếu xác thực được cố gắng nhưng không thành công, hãy đưa ra một AuthenticationFailed ngoại lệ.
Phản hồi lỗi sẽ được trả về ngay lập tức, bất kể mọi kiểm tra quyền và không kiểm tra bất kỳ sơ đồ xác
thực nào khác.
Bạn cũng có thể ghi đè .authenticate_header(self, request) phương thức này. Nếu được triển khai,
nó sẽ trả về một chuỗi sẽ được sử dụng làm giá trị của WWW-Authenticate tiêu đề trong HTTP 401
Unauthorized phản hồi.
Nếu .authenticate_header() phương thức không bị ghi đè, sơ đồ xác thực sẽ trả về HTTP 403
Forbidden phản hồi khi yêu cầu không được xác thực bị từ chối truy cập.
Lưu ý: Khi trình xác thực tùy chỉnh của bạn được gọi bởi các thuộc tính .user hoặc .auth đối tượng yêu
cầu, bạn có thể thấy tệp AttributeError được nâng cấp lại dưới dạng tệp WrappedAttributeError .
Điều này là cần thiết để ngăn chặn ngoại lệ ban đầu bị chặn bởi quyền truy cập thuộc tính bên ngoài. Python
sẽ không nhận ra rằng AttributeError nguồn gốc từ trình xác thực tùy chỉnh của bạn và thay vào đó sẽ
cho rằng đối tượng yêu cầu không có thuộc tính .user or .auth . Những lỗi này phải được sửa hoặc xử lý
bởi người xác thực của bạn.
Ví dụ
Ví dụ sau sẽ xác thực mọi yêu cầu đến với tư cách là người dùng do tên người dùng cung cấp trong tiêu đề
yêu cầu tùy chỉnh có tên 'X-USERNAME'.
class ExampleAuthentication(authentication.BaseAuthentication):
def authenticate(self, request):
username = request.META.get('HTTP_X_USERNAME')
if not username:
return None
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
raise exceptions.AuthenticationFailed('No such user')
django-rest-knox
Thư viện Django-rest-knox cung cấp các mô hình và chế độ xem để xử lý xác thực dựa trên mã thông báo
theo cách an toàn và mở rộng hơn so với sơ đồ TokenAuthentication tích hợp sẵn - lưu ý đến Ứng dụng một
trang và ứng dụng di động. Nó cung cấp mã thông báo cho mỗi khách hàng và các chế độ xem để tạo chúng
khi được cung cấp một số xác thực khác (thường là xác thực cơ bản), để xóa mã thông báo (cung cấp đăng
xuất được thực thi bởi máy chủ) và xóa tất cả mã thông báo (đăng xuất tất cả các ứng dụng khách mà người
dùng đã đăng nhập vào ).
Thêm gói vào INSTALLED_APPS và sửa đổi cài đặt khung REST của bạn.
INSTALLED_APPS = [
...
'oauth2_provider',
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
]
}
Để biết thêm chi tiết, hãy xem khung Django REST - Tài liệu bắt đầu .
Gói này trước đây được đưa trực tiếp vào khung REST nhưng hiện được hỗ trợ và duy trì dưới dạng gói của
bên thứ ba.
Để biết chi tiết về cấu hình và cách sử dụng, hãy xem tài liệu OAuth của khung REST Django để xác thực và
cấp quyền .
Xác thực mã thông báo web JSON
Mã thông báo Web JSON là một tiêu chuẩn khá mới có thể được sử dụng để xác thực dựa trên mã thông báo.
Không giống như sơ đồ TokenAuthentication tích hợp sẵn, Xác thực JWT không cần sử dụng cơ sở dữ liệu để
xác thực mã thông báo. Gói xác thực JWT là djangorestframework-simplejwt cung cấp một số tính năng cũng
như ứng dụng danh sách đen mã thông báo có thể cắm được.
Djoser
Thư viện Djoser cung cấp một tập hợp các khung nhìn để xử lý các hành động cơ bản như đăng ký, đăng
nhập, đăng xuất, đặt lại mật khẩu và kích hoạt tài khoản. Gói hoạt động với mô hình người dùng tùy chỉnh và
sử dụng xác thực dựa trên mã thông báo. Đây là bản triển khai REST sẵn sàng để sử dụng của hệ thống xác
thực Django.
django-rest-auth / dj-rest-auth
Thư viện này cung cấp một tập hợp các điểm cuối API REST để đăng ký, xác thực (bao gồm xác thực phương
tiện truyền thông xã hội), đặt lại mật khẩu, truy xuất và cập nhật thông tin người dùng, v.v. Bằng cách có các
điểm cuối API này, các ứng dụng khách của bạn như AngularJS, iOS, Android và các ứng dụng khác có thể
giao tiếp độc lập với trang web phụ trợ Django của bạn thông qua API REST để quản lý người dùng.
Django-rest-auth là dự án ban đầu nhưng hiện không nhận được bản cập nhật .
Dj-rest-auth là một nhánh mới hơn của dự án.
drf-xã hội-oauth2
Drf-social-oauth2 là một khung giúp bạn xác thực với các nhà cung cấp oauth2 xã hội lớn, chẳng hạn như
Facebook, Google, Twitter, Orcid, v.v. Nó tạo mã thông báo theo cách JWTed với thiết lập dễ dàng.
django-rest-authemail
django-rest-authemail cung cấp giao diện API RESTful để đăng ký và xác thực người dùng. Địa chỉ email được
sử dụng để xác thực chứ không phải tên người dùng. Điểm cuối API có sẵn để đăng ký, xác minh email đăng
ký, đăng nhập, đăng xuất, đặt lại mật khẩu, xác minh đặt lại mật khẩu, thay đổi email, xác minh thay đổi email,
thay đổi mật khẩu và chi tiết người dùng. Một dự án ví dụ đầy đủ chức năng và hướng dẫn chi tiết được bao
gồm.
Django-Rest-Durin
Django-Rest-Durin được xây dựng với ý tưởng có một thư viện xác thực mã thông báo cho nhiều ứng dụng
khách API Web/CLI/Mobile thông qua một giao diện nhưng cho phép cấu hình mã thông báo khác nhau cho
mỗi Ứng dụng khách API sử dụng API. Nó cung cấp hỗ trợ nhiều mã thông báo cho mỗi người dùng thông qua
các mô hình, chế độ xem, quyền tùy chỉnh hoạt động với Django-Rest-Framework. Thời gian hết hạn mã thông
báo có thể khác nhau đối với mỗi ứng dụng khách API và có thể tùy chỉnh thông qua Giao diện quản trị
Django.
Thông tin thêm có thể được tìm thấy trong Tài liệu .