web-dev-qa-db-fra.com

Django: en-tête d'authentification Rest Framework

En utilisant l'API Django REST , j'essaie d'authentifier ma demande.

Voici ce que j'essaie d'envoyer:

Content-Type: application/json, Authentication: token="6d82549b48a8b079f618ee9c51a6dfb59c7e2196"

Voici ce que je récupère:

{"detail": "Authentication credentials were not provided."}

Quelqu'un pourrait-il me donner l'en-tête correct?

Merci

L'en-tête:

Accept: application/json
Content-Type: application/json
Authorization: Token 6d82549b48a8b079f618ee9c51a6dfb59c7e2196
Connection: keep-alive
Origin: chrome-extension: //rest-console-id
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17

enter image description here

Settings.py

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.permissions.IsAdminUser',


    ),
    'PAGINATE_BY': 10
}

view.py

class ProfileList(generics.ListCreateAPIView):
    """
    API endpoint that represents a list of users.
    """
    permission_classes = (permissions.IsAuthenticated,)
    model = Profile
    serializer_class = ProfileSerializer

    def pre_save(self, obj):
        obj.owner = self.request.user
42
Prometheus

En supposant que vous essayez d'utiliser TokenAuthentication, l'en-tête devrait ressembler à ceci:

Authorization: Token 6d82549b48a8b079f618ee9c51a6dfb59c7e2196

Comme décrit dans la documentation .

27
Tom Christie

Juste au cas où quelqu'un d'autre rencontrerait cette erreur. Cela peut également se produire si vous exécutez Django sur Apache en utilisant mod_wsgi car l'en-tête d'autorisation est supprimé par mod_wsgi. Vous devrez ajouter ce qui suit à votre configuration VirtualHost:

WSGIPassAuthorization On

113
Fiver

J'avais le même problème avec mon authentification de jeton

Cela m'a résolu le problème

settings.py

REST_FRAMEWORK = {
   'DEFAULT_AUTHENTICATION_CLASSES': (
       'rest_framework.authentication.TokenAuthentication',
   ),
   'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAdminUser'
   ),
   'PAGINATE_BY': 10,
}
19
omarc7

Dans mon cas, cela fonctionne:
(Django REST Framework v3)

settings.py

REST_FRAMEWORK = {
   'DEFAULT_AUTHENTICATION_CLASSES': (
       'rest_framework.authentication.TokenAuthentication',
       'rest_framework.authentication.SessionAuthentication',
   ),
   'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
   ),
}

views.py

class Test(APIView):
    def get(self, request, format=None):   
        return Response({'Result': 'OK'})

rls.py

router.add_api_view('test', url(r'^test/', views.Test.as_view(),name='test'))

N'oubliez pas d'envoyer les informations de jeton dans l'en-tête:

 Key: Authorization  
 Value: Token 76efd80cd6849ad7d35e04f1cc1eea35bdc20294

Pour générer des jetons, vous pouvez utiliser ce qui suit (quelque part dans votre code):

from rest_framework.authtoken.models import Token            
user = User.objects.get(username='<username>')
token = Token.objects.create(user=user)
print(token.key)
7
Slipstream

Pour ceux qui utilisent le haricot élastique AWS et vous êtes un peu coincé avec Apache et à moins que vous n'ayez

WSGIPassAuthorization On

Comme mentionné par @Fiver, vos en-têtes sont supprimés

Au lieu de corriger cela manuellement et de créer une nouvelle image, j'ai créé un script qui vérifie si la dernière ligne du fichier conf est WSGIPassAuthorization On et si ce n'est pas le cas, nous le mettons à jour et redémarrons le serveur

Dans mon Django app j'ai un dossier de configuration avec mon fichier sh

configs/server/update-Apache.sh

if [[ $(tac /etc/httpd/conf/httpd.conf | egrep -m 1 .) == $(echo 'WSGIPassAuthorization On') ]];
  then
     echo "Httpd.conf has already been updated"
  else
     echo "Updating Httpd.conf.."
     echo 'WSGIPassAuthorization On' >> /etc/httpd/conf/httpd.conf
     service httpd restart
fi

Rendez-le exécutable avant de le valider

chmod +x configs/server/update-Apache.sh

Puis dans mon fichier python.config j'ajoute la commande à la fin

.ebextensions/python.config

...
...
container_commands:
    01_migrate:
        command: "python manage.py migrate"
        leader_only: true
    02_collectstatic:
        command: "python manage.py collectstatic --noinput"
    03_change_perm:
        command: "chown -R wsgi:root static"
    03_update_Apache:
        command: "sh configs/server/update-Apache.sh"

Maintenant, toute nouvelle machine qui démarre aura une vérification pour voir si le serveur est mis à jour et le fait si nécessaire.

2
Dr Manhattan