wake-up-neo.com

So verwenden Sie TokenAuthentication für API im Django-rest-Framework

Ich habe ein Django-Projekt, das Django-Rest-Framework verwendet, um API zu erstellen.

Möchten Sie ein Token-Basis-Authentifizierungssystem verwenden, so dass der Aufruf von api (put, post, delete) nur für autorisierte Benutzer ausgeführt wird.

Ich habe 'rest_framework.authtoken' installiert und für jeden Benutzer ein Token erstellt.

Nun, von Django.contrib.auth.backends authenticate gibt es den Benutzer mit auth_token als Attribut zurück. (bei erfolgreicher Anmeldung).

Nun ist meine Frage, wie kann ich das Token mit der Post-Anfrage an meine API und An der API-Seite senden. Wie kann ich überprüfen, ob das Token gültig ist und zum richtigen Benutzer gehört?

Gibt es in der Anwendung rest_framework.authtoken Methoden, um den angegebenen Benutzer und sein Token zu überprüfen? Nicht gefunden dies sehr nützlich!

Update (Änderungen, die ich vorgenommen habe): Dies wurde in meinen Einstellungen hinzugefügt.py:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    )
}

Token auch in meinem Header senden, aber es funktioniert immer noch nicht:

if new_form.is_valid:
    payload= {"createNewUser":
              { "users": request.POST["newusers"],
                "email": request.POST["newemail"]
                }
              }

    headers =  {'content-type' : 'application/json', 
                'Authorization': 'Token 6b929e47f278068fe6ac8235cda09707a3aa7ba1'}

    r = requests.post('http://localhost:8000/api/v1.0/user_list',
                      data=json.dumps(payload),
                      headers=headers, verify=False)
31
Peter

"Wie kann ich das Token mit der Post-Anfrage an meine API senden"

Aus den Dokumenten ...

Für die Authentifizierung durch Clients sollte der Tokenschlüssel im Autorisierungs-HTTP-Header enthalten sein. Dem Schlüssel sollte das Zeichenfolgenliteral "Token" vorangestellt werden, wobei die beiden Zeichenfolgen durch Leerzeichen getrennt werden. Zum Beispiel:

Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b

"Wie kann ich auf der API-Seite überprüfen, ob das Token gültig ist und zum richtigen Benutzer gehört?"

Sie brauchen nichts weiter zu tun, greifen Sie einfach auf request.user zurück, um den authentifizierten Benutzer zurückzugeben. Das REST - Framework behandelt die Antwort '401 Unauthorized' auf eine falsche Authentifizierung.

33
Tom Christie

Um die erste Hälfte Ihrer Frage zu beantworten: 

wie kann ich das Token mit der Post-Anfrage an meine API senden

Sie können die Python request library verwenden. Für das Django-rest-Framework TokenAuthentication muss das Token im Header übergeben und der Zeichenfolge Token vorangestellt werden ( siehe hier ):

import requests
mytoken = "4652400bd6c3df8eaa360d26560ab59c81e0a164"
myurl = "http://localhost:8000/api/user_list"

# A get request (json example):
response = requests.get(myurl, headers={'Authorization': 'Token {}'.format(mytoken)})
data = response.json()

# A post request:
data = { < your post data >}
requests.post(myurl, data=data, headers={'Authorization': 'Token {}'.format(mytoken)})
3
elke

Ich habe endlich das Django-Paket "rest-auth" für die Token-Authentifizierung. Wenn dies hilfreich ist, hier der clientseitige jQuery-Code, der für mich funktioniert hat, nachdem Sie sich erfolgreich angemeldet haben und das "auth_token" erhalten haben:

var user_url = {API URL}/rest-auth/login
var auth_headers = {
  Authorization: 'Token ' + auth_token
}
var user_ajax_obj = {
  url : user_url,
  dataType : 'json',
  headers: auth_headers,
  success : function(data) {
    console.log('authorized user returned');
  },
  error: function(XMLHttpRequest, textStatus, errorThrown) {
    console.log('error returned from ' + user_url);
  }
};
$.ajax(
  user_ajax_obj
);
1
Stefan Musarra

Wenn Sie Coreapi verwenden. Um die Autorisierung hinzuzufügen, müssen Sie import coreapi auth = coreapi.auth.TokenAuthentication(scheme='Token', token=token_key) .__ eingeben. Dann können Sie client = coreapi.Client(auth=auth) response = client.get(my_url)

0
unlockme