2017-10-13 2 views
0

Je rencontre des problèmes pour tester l'API de repos de Django avec cURL et Postman. J'utilise LoginRequiredMixin pour restreindre l'accès à mon ClassView:CURL et Postman ne peuvent pas accéder à l'API de repos de Django avec LoginRequiredMixin

class UserList(LoginRequiredMixin, generics.ListCreateAPIView): 
    model = User 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 

Lorsqu'un utilisateur non autorisé tente d'accéder à la page, il est redirigé vers la page de connexion. Dans l'URL est un paramètre suivant afin que l'utilisateur affiche la page souhaitée juste après l'autorisation.

/accounts/login/?next=/users/ 

Le problème est que cURL et Postman probablement pas le nom d'utilisateur même pas utiliser le mot de passe fourni et pour l'authentification et sont immédiatement redirigés vers la page de connexion qui est retourné en conséquence.

Voici un exemple ou une commande cURL. Même si le nom d'utilisateur et le mot de passe sont fournis, le résultat est 302 Trouvé. Lorsque j'ajoute le paramètre -L pour les redirections suivantes, il renvoie la réponse de la page de connexion et ne redirige pas vers la page d'origine.

curl -i -L -u superadmin:superadmin http://127.0.0.1:8000/users/ 
HTTP/1.0 302 Found 
Date: Fri, 13 Oct 2017 10:16:31 GMT 
Server: WSGIServer/0.2 CPython/3.5.2 
Vary: Cookie 
Content-Length: 0 
Content-Type: text/html; charset=utf-8 
Location: /accounts/login/?next=/users/ 
X-Frame-Options: SAMEORIGIN 

HTTP/1.0 200 OK 
Date: Fri, 13 Oct 2017 10:16:31 GMT 
Server: WSGIServer/0.2 CPython/3.5.2 
Vary: Cookie 
Content-Length: 1128 
Content-Type: text/html; charset=utf-8 
Cache-Control: max-age=0, no-cache, must-revalidate, no-store 
X-Frame-Options: SAMEORIGIN 
Expires: Fri, 13 Oct 2017 10:16:31 GMT 
Set-Cookie: csrftoken=cCfAfsSlHOZEQGvPD1RR33r1UXj6JtEscWKFjmVyHmvVasqMx2J0pqyeNbVpY3X9; expires=Fri, 12-Oct-2018 10:16:31 GMT; Max-Age=31449600; Path=/ 

<html> 
    <head> 
     <title>Login</title> 
    </head> 
    <body> 
     <h1>Login</h1> 

     <form method="post" action=""> 
      <table> 
       <tr> 
        <td><label for="id_username">Username:</label></td> 
        <td><input type="text" name="username" id="id_username" autofocus maxlength="254" required /></td> 
       </tr> 
       <tr> 
        <td><label for="id_password">Password:</label></td> 
        <td><input type="password" name="password" id="id_password" required /></td> 
       </tr> 
       <tr> 
        <td colspan="2"> 
         <input type="submit" value="Login" /> 
         <input type="hidden" name="next" value="/private/meals/" /> 
         <input type='hidden' name='csrfmiddlewaretoken' value='Pd3g7jmZ0WAACWihmRxNGvLF2wy5yzP9Pxylbdpc0u6RWIdegSpW2SSSVKaoN98Q' /> 
        </td> 
       </tr> 
      </table> 
     </form> 

     <p><a href="/accounts/signup/">Sign up</a></p> 
    </body> 
</html> 

J'ai essayé l'enregistrement et cookies de chargement comme suggéré here mais il ne fonctionne pas non plus. Est-il possible de passer le LoginRequiredMixin dans cURL et Postman? Ou quelle est la bonne méthode de restriction d'accès dans Django Rest Framework qui fonctionnerait avec les testeurs Rest API.

Merci

Répondre

0

Avez-vous essayé en utilisant l'option -e?

De curl manpage

-e, --referer <URL> 

    (HTTP) Sends the "Referrer Page" information to the HTTP server. This can also be set with the -H, --header flag of course. When used with -L, --location you can append ";auto" to the -e, --referer URL to make curl automatically set the previous URL when it follows a Location: header. The ";auto" string can be used alone, even if you don't set an initial -e, --referer. 

    If this option is used several times, the last one will be used. 

    See also -A, --user-agent and -H, --header. 
+0

Malheureusement, cela n'aide pas non plus. Je n'utilise pas de code différent pour les autres navigateurs et ne vérifie pas d'où vient l'utilisateur. Je ne suis pas sûr de savoir comment utiliser l'option --header ou comment cela devrait aider. Je commence à penser que cURL et Postman n'utilisent même pas l'authentification fournie et sont redirigés immédiatement par LoginRequiredMixin dans Django. Je ne suis pas sûr quelle autre bonne restriction d'accès dans Django j'ai. –

+0

avez-vous dit que l'enregistrement des cookies n'a pas fonctionné? comme dans: curl -X POST -d "nom d'utilisateur = superadmin & mot de passe = superadmin" -c connexion http: // localhost: 8000/accounts/login; curl -b connexion http: // localhost: 8000/users/ – efkin

+0

Wow. Avec une petite modification, cela fonctionne réellement. Après la connexion en postant des données à la page de connexion j'ai eu "403 Interdit - La vérification CSRF a échoué. message. Ce qui est bizarre, car j'ai correctement défini le jeton csrf dans la page de connexion.Néanmoins, j'ai essayé de paramétrer csrf en tant que paramètres de la commande curl comme conseillé [ici] (https://stackoverflow.com/questions/10628275/how-to-use-curl-with-django-csrf-tokens-and-post-requests) et ça a marché.
Avez-vous une idée de comment le faire avec Postman. Aussi pourriez-vous l'afficher comme une réponse. Je le ferais, mais je ne veux pas prendre votre crédit. –

1

Vous devez utiliser un mécanisme d'authentification approprié. Vous devez vérifier le AUTHENTICATION_BACKEND que vous utilisez. Il est fort probable que vous utilisiez une authentification basée sur une session, ce qui signifie que vous devez ajouter un cookie dans Postman qui contient une session authentifiée.

Pour obtenir le cookie, connectez-vous à votre site Web via Chrome, ouvrez Developer Tools -> Storage -> Cookies. Recherchez votre Domain et copiez le Name et le Value dans le Postman app -> Cookies -> Manage Cookies de votre domaine.

Cette méthode d'authentification REST n'est pas appropriée. Postman fournit un support pour varied authentication mechanisms comme Basic Auth (qui est ce que vous essayez de faire avec un nom d'utilisateur/mot de passe), OAuth, Digest Auth et plusieurs autres techniques. Si vous avez l'intention de créer des API REST pour votre backend, il est préférable d'utiliser un framework d'API Django tel que Django REST Framework ou Django Tastypie.