web-dev-qa-db-fra.com

Comment utiliser TokenAuthentication for API dans Django-rest-framework

J'ai un projet Django, qui utilise Django-rest-framework pour créer un API.

Vous souhaitez utiliser le système d'authentification de base de jetons pour que l'appel api pour (mettre, publier, supprimer) ne soit exécuté que pour un utilisateur autorisé.

J'ai installé 'rest_framework.authtoken' et créé un jeton pour chaque utilisateur.

Donc, maintenant de Django.contrib.auth.backends authentifier, il retourne utilisateur, avec auth_token comme attribut. (une fois connecté avec succès).

Maintenant, ma question est la suivante: comment puis-je envoyer le jeton avec la demande de publication à mon API et Côté API, comment puis-je vérifier si le jeton est valide et appartient au bon utilisateur?

Existe-t-il des méthodes dans app rest_framework.authtoken pour valider un utilisateur donné et son jeton? Non trouvé this très utile!

Mise à jour (modifications apportées): Ajouté ceci dans mon settings.py:

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

Envoi également de Token dans mon en-tête mais cela ne fonctionne toujours pas:

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

"comment puis-je envoyer le jeton avec la demande de poste à mon api"

De la docs ...

Pour que les clients s'authentifient, la clé de jeton doit être incluse dans l'en-tête HTTP d'autorisation. La clé doit être préfixée par le littéral de chaîne "Token", un espace séparant les deux chaînes. Par exemple:

Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b

"côté api, comment puis-je vérifier si le jeton est valide et appartient au bon utilisateur?"

Vous n'avez rien à faire, il vous suffit d'accéder à request.user pour renvoyer l'utilisateur authentifié - la structure REST traitera le renvoi d'une réponse «401 non autorisée» à toute authentification incorrecte.

33
Tom Christie

Pour répondre à la première moitié de votre question: 

comment puis-je envoyer le jeton avec la demande de poste à mon api

Vous pouvez utiliser la bibliothèque Python request . Pour TokenAuthentication de Django-rest-framework, le jeton doit être passé dans l'en-tête et précédé de la chaîne Token ( voir ici ):

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

Enfin, le package Django "rest-auth" fonctionne pour l'authentification par jeton. Si cela vous aide, voici le code jQuery côté client qui a fonctionné pour moi, après vous être connecté et avoir reçu le "auth_token":

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

Si vous utilisez coreapi. Pour ajouter l'autorisation que vous faites import coreapi auth = coreapi.auth.TokenAuthentication(scheme='Token', token=token_key) Ensuite, vous pouvez faire client = coreapi.Client(auth=auth) response = client.get(my_url)

0
unlockme