1

Я использую django rest framework Token Authentication. В случае, если я вызываю url, предоставляя токен (Token aesdghfhkjdsajgaadsa), который недействителен или уже удален, я получаю всплывающее окно с запросом имени пользователя и пароля. Как я могу избежать всплывающих подсказок? Я просто нужен ответ какDjango Rest Framework Token Аутентификация неудачных результатов в Pop

{"status": -1, "errors": "Token Expired"} 

Я использую пользовательский маркер проверки подлинности, как указано,

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): 
     token.delete() 
     raise exceptions.AuthenticationFailed('Token has expired') 

    return token.user, token 

Есть ли решение для этого?

ответ

1

Я предполагаю, что всплывающее окно является именем пользователя/паролем, генерируемым схемами аутентификации HTTP Basic/Digest? Скорее всего, это происходит из класса проверки подлинности BasicAuthentication.

Django Rest Framework будет перебирать методы аутентификации, перечисленные в DEFAULT_AUTHENTICATION_CLASSES, если вы явно не предоставили список в APIView.authentication_classes.

http://www.django-rest-framework.org/api-guide/authentication/#setting-the-authentication-scheme

+0

Это было правильно. Мне пришлось изменить список DEFAULT_AUTHENTICATION_CLASSES. Когда я удаляю BasicAuthentication из своего списка, я получил решение. благодаря –

-1

Я надеюсь, что вы хотите что-то вроде этого:

def authenticate_credentials(self, key): 
     resp = {} 
     try: 
      token = self.model.objects.get(key=key) 
     except self.model.DoesNotExist: 
      resp["status"] = -1 
      resp["errors"] = "Invalid token" 
      return resp 

     if not token.user.is_active: 
      resp["status"] = -1 
      resp["errors"] = "User inactive or deleted" 
      return resp 

     # 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): 
      token.delete() 
      resp["status"] = -1 
      resp["errors"] = "Token has expired" 
      return resp 

     return token.user, token 
Смежные вопросы