2015-06-02 4 views
2

Запросы API будут отправлены анонимными пользователями. Нет функции входа/регистрации.Как аутентифицировать запросы API (анонимным пользователем) в Django rest framework?

Мне нужно аутентифицировать запросы API, одним из примитивных способов, которым я пытался, было отправить ключ авторизации в каждом запросе. Этот ключ auth, я сохранен в Angular frontend как константа.

Должно быть лучше и сложнее, любезно помочь!

ответ

0

Прочитать остальную часть api docs на authentication и их tutorial - они предлагают прочное введение в параметры.

+0

Спасибо, я просмотрел документы, все схемы auth основаны на предположении, что запросы исходят от пользователя, есть ли способ аутентификации запросов, у которых нет какого-либо пользователя, связанного с ними? – aliasav

+0

Учитывая, что «аутентификация - это процесс подтверждения личности человека», я действительно не понимаю, что вы подразумеваете под аутентификацией запросов, у которых нет идентификатора, связанного с ними? – spectras

5

Структура Django REST во многом предполагает, что запросы аутентифицируются на основе пользователя, но они обеспечивают поддержку анонимных запросов аутентификации. Хотя это в значительной степени нарушает предположение о том, что «аутентификация» означает, что «проверка пользователя (Django) является подлинной», инфраструктура Django REST позволяет это произойти и вместо этого заменяет AnonymousUser.

Аутентификация в DRF может определять как request.user (аутентифицированный пользователь), так и request.auth (обычно используемый токен, если применимо) в запросе. Таким образом, для вашей проверки подлинности вы будете придерживаться маркеров, которые вы создали (в модели или где-то еще), и они будут проверяться вместо учетных данных пользователя, и вы просто не сможете установить пользователя.

from django.contrib.auth.models import AnonymousUser 
from rest_framework import authentication 
from rest_framework import exceptions 

class ExampleAuthentication(authentication.BaseAuthentication): 
    def authenticate(self, request): 
     auth = authentication.get_authorization_header(request) 

     if not auth or auth[0].lower() != b'token': 
      return None 

     if len(auth) == 1: 
      msg = _('Invalid token header. No credentials provided.') 
      raise exceptions.AuthenticationFailed(msg) 
     elif len(auth) > 2: 
      msg = _('Invalid token header. Credentials string should not contain spaces.') 
      raise exceptions.AuthenticationFailed(msg) 

     try: 
      token = Token.objects.get(token=auth[1]) 
     except Token.DoesNotExist: 
      raise exceptions.AuthenticationFailed('No such token') 

     return (AnonymousUser(), token) 

В этом примере предполагается, что у вас есть Token модель, которая хранит лексемы, которые будут проверкой подлинности. Объекты токена будут установлены в request.auth, если запрос был аутентифицирован должным образом.

Смежные вопросы