2013-05-24 12 views
5

ich eine Authentifizierungs-Klasse gemacht haben einfach so:'WSGIRequest' Objekt hat kein Attribut 'successful_authenticator'

Token Authentication for RESTful API: should the token be periodically changed?

restapi/settings.py

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.BasicAuthentication', 
     'rest_framework.authentication.SessionAuthentication', 
     # 'rest_framework.authentication.TokenAuthentication', 
     'restapi.authentication.ExpiringTokenAuthentication', 
    ), 
    'PAGINATE_BY': 10 
} 

restapi/authentication.py

import datetime 
from rest_framework.authentication import TokenAuthentication 

class ExpiringTokenAuthentication(TokenAuthentication): 
    def authenticate_credentials(self, key): 
     try: 
      token = self.model.objects.get(key=key) 
     except self.model.DoesNotExist: 
      raise exceptions.AuthenticationFailed('Invalid token') 

     if not token.user.is_active: 
      raise exceptions.AuthenticationFailed('User inactive or deleted') 

     # This is required for the time comparison 
     utc_now = datetime.utcnow() 
     utc_now = utc_now.replace(tzinfo=pytz.utc) 

     if token.created < utc_now - timedelta(hours=24): 
      raise exceptions.AuthenticationFailed('Token has expired') 

     return token.user, token 

restapi/tests.py

def test_get_missions(self): 
    """ 
    Tests that /missions/ returns with no error 
    """ 
    response = self.client.get('/missions/', HTTP_AUTHORIZATION = self.auth) 

In meinen Tests habe ich eine Ausnahme AttributeError: 'WSGIRequest' object has no attribute 'successful_authenticator'

Warum ich diesen Fehler mit bin? Wie man es repariert?

+0

sollte 'self.request' sein nicht' request.'? – karthikr

+0

Nein, es ist nicht verwandt. –

+0

was meinst du es ist nicht verwandt? – karthikr

Antwort

6

Das Problem kommt aus der Leitung:

utc_now = datetime.utcnow() 

die AttributeError: 'WSGIRequest' object has no attribute 'successful_authenticator' verursacht.

Es ist schon eine Weile her, seit ich auf eine solche irreführende Fehlermeldung gestoßen bin.

Hier ist, wie ich es gelöst:

restapi/authentication.py

import datetime 
from django.utils.timezone import utc 
from rest_framework.authentication import TokenAuthentication 
from rest_framework import exceptions 

class ExpiringTokenAuthentication(TokenAuthentication): 
    def authenticate_credentials(self, key): 
     try: 
      token = self.model.objects.get(key=key) 
     except self.model.DoesNotExist: 
      raise exceptions.AuthenticationFailed('Invalid token') 

     if not token.user.is_active: 
      raise exceptions.AuthenticationFailed('User inactive or deleted') 

     utc_now = datetime.datetime.utcnow().replace(tzinfo=utc) 

     if token.created < utc_now - datetime.timedelta(hours=24): 
      raise exceptions.AuthenticationFailed('Token has expired') 

     return (token.user, token) 
+0

Ich hatte ein ähnliches Problem beim Versuch, auf 'user.username' auf einem benutzerdefinierten Benutzermodell zuzugreifen –

+1

wow so viel für klare Fehlermeldungen! –

+0

Ich bin gerade auf diese Art von Problem gestoßen, das heißt, eine allgemeine Ausnahme bei der Authentifizierung. Es sieht so aus, als ob die Ausnahme als erfolgreiche Authentifizierung maskiert wird, aber ohne die Objekte request.user und auth. – jacob

Verwandte Themen