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
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. –
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
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. –