2015-10-11 8 views
5

Die JWT-basierte Authentifizierung funktioniert gut mit POST-Anfragen, die von Mobilgeräten und vom "Advanced Rest Client" gesendet werden. Sie schlägt jedoch fehl, wenn der Django-Testclient verwendet wird. Der Client empfängt das Token erfolgreich, wenn es angefordert wird. Beim Versuch, mit diesem Token auf eine eingeschränkte Sicht zuzugreifen, wird jedoch die folgende Antwort angezeigt.Testen der Authentifizierung mit REST Framework JWT?

"Authentifizierungsdaten wurden nicht bereitgestellt."

Der Testfall:

def test_get_token(self): 
     response = self.client.post("/auth/api/get_token/", {"username": "Heffalumps", "password": "Woozles"}) 
     self.assertEqual(response.status_code, 200, "The token should be successfully returned.") 

     response_content = json.loads(response.content.decode('utf-8')) 
     token = response_content["token"] 

     # The following request fails 
     response = self.client.post("/auth/api/authenticated/", {}, Authorization='JWT ' + token) 
     response_content = json.loads(response.content.decode('utf-8')) 

     self.assertEqual(response_content["authenticated"], "mooh", "The user should be able to access this endpoint.") 

Outgoing Anfrage von Test-Client: enter image description here

Die eingeschränkte Sicht:

class RestrictedView(APIView): 
    permission_classes = (permissions.IsAuthenticated,) 
    authentication_classes = (JSONWebTokenAuthentication,) 

    def post(self, request): 

     response_data = json.dumps({"authenticated": "mooh"}) 

     return HttpResponse(response_data, content_type='application/json') 

Bin ich etwas aus dem Testfall fehlt?

Antwort

9

Okay, scheint die folgende das Problem gelöst zu haben:

Statt:

response = self.client.post("/auth/api/authenticated/", {}, Authorization='JWT ' + token) 

ich schreiben musste:

response = self.client.post("/auth/api/authenticated/", {}, HTTP_AUTHORIZATION='JWT {}'.format(token)) 

Authentication nun durch den Django-Test-Client arbeitet als Gut.

+0

Vielen Dank! Habe meinen Tag gerettet. –

+0

Ich habe die Django Rest API mit Token-Authentifizierung verwendet und muss sie ändern in: Antwort = self.client.get ('/ api/satururl', {}, HTTP_AUTHORIZATION = 'Token {}'. Format (self.token)) –

0

Es kann hilfreich sein, festzustellen, dass bei der Verwendung von JWT über OAuth2, der folgende Code erstellt die Authentifizierungsinformationen:

self.client.post("/auth/api/authenticated/", {}, HTTP_AUTHORIZATION='Bearer {0}'.format(token)) 

Django Rastrahmen jedoch Gerüst umfasst eine Anfrage zur Authentifizierung: http://www.django-rest-framework.org/api-guide/testing/#forcing-authentication

Zusätzlich gibt es hier einige interessante Tests: https://github.com/jpadilla/django-jwt-auth/blob/master/tests/test_mixins.py

Verwandte Themen