django-repos-cadre de retourner 403 réponse sur le POST, PUT, DELETE, malgré AllowAny autorisations
Je suis en utilisant un django-oneall pour permettre la connexion de la session d'authentification sur mon site. Alors que ce n'est pas l'une des suggestions auth fournisseurs pour django-repos-cadre, rest_framework.authentication.SessionAuthentication
utilise django par défaut de la session d'authentification. j'ai donc pensé qu'il devrait être assez simple à intégrer.
Sur les autorisations de côté, en fin de compte je vais utiliser IsAdmin
, mais à des fins de développement, j'avais juste mis à IsAuthenticated
. Lorsque que le retour 403s, je me suis détendu les autorisations de AllowAny
, mais toujours pas de dés. Voici mon repos cadre config:
settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.AllowAny',
# 'rest_framework.permissions.IsAuthenticated',
# 'rest_framework.permissions.IsAdminUser',
),
'PAGE_SIZE': 100,
'DEFAULT_FILTER_BACKENDS': (
'rest_framework.filters.DjangoFilterBackend',
),
}
EDIT:
J'ai eu ce travail basé sur la réponse ci-dessous. Il s'avère que rest_framework
prévoit à la fois la csrftoken
cookie et un X-CSRFToken
en-Tête de la même valeur, j'ai installé mon frontal code pour envoyer cet en-tête pour toutes les requêtes ajax et tout a bien fonctionné.
Vous devez vous connecter pour publier un commentaire.
Django REPOS Cadre renvoie le code d'état
403
en vertu d'un couple de circonstances pertinentes:DEFAULT_PERMISSION_CLASSES
est('rest_framework.permissions.IsAuthenticated',)
.rest_framework.authentication.SessionAuthentication
et vous n'avez pas compris votre CSRFToken dans le requeset.Je vais faire un peu de démo demandes à l'encontre d'un test de l'API pour donner un exemple de chacun pour vous aider à diagnostiquer le problème que vous rencontrez et de montrer comment le résoudre. Je vais utiliser le
requests
bibliothèque.Le test de l'API
- Je configurer un très simple DRF API avec un modèle unique,
Life
, qui contient un seul champ (answer
, avec une valeur par défaut de42
). Tout ici est assez simple; je configurer unModelSerializer
-LifeSerializer
, unModelViewSet
-LifeViewSet
, et unDefaultRouter
sur le/life
URL route. J'ai configuré DRF d'exiger de l'utilisateur authentifié l'utilisation de l'API et de l'utilisationSessionAuthentication
.Frapper l'API
HTTP_X_CSRFTOKEN
en-tête?X-CSRFToken
et le cookiecsrftoken
a dû être établi.$.ajaxSetup()
ou l'équivalentIsAuthenticated
privs. Une fois que j'ai mise à jour mon login/enregistrement de la page afin qu'il puisse différencier entre l'administrateur et les utilisateurs normaux, je vais pouvoir passer àIsAdmin
!Par souci d'exhaustivité, il y a encore une circonstance qui DRF retourne le code 403: si vous oubliez d'ajouter
as_view()
à la vue dans votre déclaration urls.py fichier. M'est juste arrivé, et j'ai passé des heures jusqu'à ce que j'ai trouvé où le problème a été, peut-être que ce plus pouvez enregistrer un peu de temps pour quelqu'un.as_view
est pour django classe des vues basées sur les, il a à ma connaissance rien à faire avec l'api-url de django-repos-cadre. DRF aussi ne le mentionne pas dans leur routage de la documentation (puis d'autres, y compris pour les non-DRF vues) django-rest-framework.org/api-guide/routers . Pourriez-vous élaborer sur ce que vous voulez dire?Pour n'importe qui qui pourrait trouver le même problème.
Si vous utilisez viewsets sans routeurs comme:
Django Reste-cadre sera de retour 403, sauf si vous définissez permission_classes un niveau de classe:
Espère que cela aide!