2016-06-24 11 views
0

Ich erstelle eine Ansicht, auf die voraussichtlich von einem Bot zugegriffen wird, wobei ein Benutzername und ein Passwort in der Kopfzeile übergeben werden. (Es ist ein Google Feed Bot um genau zu sein). Ich kann jedoch nie auf den Benutzernamen und das Passwort zugreifen, um die Anmeldeinformationen des Bot zu authentifizieren. request.GET.get('username') und request.GET.get('password') beide geben None zurück, da sowohl request.GET als auch request.POST leere QueryDicts zurückgeben. Ich benutze Postman mit Basis-Authentifizierung, um meine Anfragen zu testen. Hier ist mein Code von views.py:Zugriff auf Benutzername und Passwort in Django-Anfrage-Header gibt keine zurück

def authenticate_bot(request): 
    username = request.GET.get('username') 
    password = request.GET.get('password') 
    feed_bot = authenticate(username=username, password=password) 

    if feed_bot is not None: 
     # Confirmed as user credentials. 
     login(request, feed_bot) 

Wie rufe ich den Benutzernamen und das Passwort von meinem Grund Authentication Header?

Antwort

1

Danke nthall für mich in der richtigen Richtung - zu finden, die request.META Wörterbuch Schlüssel waren.

Da ich nicht viel in der Art von Ressourcen finden konnte, die den Prozess erklärten, werde ich hier den gesamten Django-Prozess zum Abrufen und Authentifizieren von Daten aus dem Autorisierungsheader posten.

import base64 
from django.contrib.auth import authenticate 

def header_auth_view(request): 
    auth_header = request.META['HTTP_AUTHORIZATION'] 
    encoded_credentials = auth_header.split(' ')[1] # Removes "Basic " to isolate credentials 
    decoded_credentials = base64.b64decode(encoded_credentials).decode("utf-8").split(':') 
    username = decoded_credentials[0] 
    password = decoded_credentials[1] 
    feed_bot = authenticate(username=username, password=password) 
    # if the credentials are correct, then the feed_bot is not None, but is a User object. 

Django tiert und Affixe des ‚HTTP_‘ prefix einen Header in der Anforderung übergeben und als nthall richtig ausgeführt hat, kann es über request.META zugegriffen werden.

Ich isoliere die Base64-codierte Informationen, die im Format 'Basic username:password' durch Aufteilen der Kopfzeile über den Raum ist, so ist es nur 'username:password'. Dann dekodiere ich mit base64 und dekodiere dann das Ergebnis, um die byteartige Zeichenfolge in eine utf-8-Zeichenfolge umzuwandeln. Dann ist es nur eine Frage der Isolierung des Benutzernamens und des Passworts. Dann gehen Sie durch den Prozess der Authentifizierung.

1

Weder request.GET noch request.POST bezieht sich auf Anforderungsheader. Die Daten, nach denen Sie suchen, sind höchstwahrscheinlich im Wörterbuch unter request.META verfügbar - weitere Details dazu finden Sie in der HttpRequest docs. Nicht sicher über die Details Ihrer Einrichtung, aber es klingt wie Sie für request.META['username'] suchen würden und request.META['password']