Wenn Sie eine grundlegende Authentifizierungsanforderung ausführen, fügen Sie die Anmeldeinformationen wirklich in den Header Authorization
ein. Vor der Übertragung sind diese Anmeldeinformationen Base64-codiert, Sie müssen sie also beim Empfang dekodieren.
Der folgende Codeausschnitt geht davon aus, dass es nur einen gültigen Benutzernamen und Passwort ein:
import base64
def my_view(request):
auth_header = request.META.get('HTTP_AUTHORIZATION', '')
token_type, _, credentials = auth_header.partition(' ')
expected = base64.b64encode(b'username:password').decode()
if token_type != 'Basic' or credentials != expected:
return HttpResponse(status=401)
# Your authenticated code here:
...
Wenn Sie auf den Benutzernamen und das Kennwort eines User
Modell zu vergleichen, gehen Sie wie folgt statt:
def my_view(request):
auth_header = request.META.get('HTTP_AUTHORIZATION', '')
token_type, _, credentials = auth_header.partition(' ')
username, password = base64.b64decode(credentials).split(':')
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
return HttpResponse(status=401)
password_valid = user.check_password(password)
if token_type != 'Basic' or not password_valid:
return HttpResponse(status=401)
# Your authenticated code here:
...
Bitte beachten Sie, dass diese letztere Version nicht extrem sicher ist. Auf den ersten Blick kann ich sehen, dass es zum Beispiel anfällig für timing attacks ist.
Ja, das sollte funktionieren. Aber irgendwie denke ich, ich bin auf dem Holzweg, wenn ich es so löse. Ich habe persönliche Richtlinien (für mich). Eine lautet: "Schreiben Sie keinen Quellcode, um eine Sicherung zu implementieren" und der nächste "Schreiben Sie keinen Quellcode, um die Authentifizierung zu implementieren". Dies wurde zuvor von mehr talentierten Leuten gelöst und es gibt bereits Implementierungen, die seit einigen Monaten getestet wurden. Trotzdem vielen Dank für diesen Ausschnitt. Ich implementiere dies jedoch viel mehr Code. – guettli