2015-03-16 4 views
1

Я использую Django Rest Framework, и я установил конечную точку входа, используя конечную точку rest_auth. Однако после входа в систему, если я обновляю страницу, вход в систему будет признан недействительным.Персистский вход в Django Rest Framework

Я проверил это путем создания `конечной точки/loginCheck», который я проверяю после входа в систему следующим образом:

@api_view(['GET',]) 
@permission_classes([AllowAny,]) 
def get_user(request): 
    user = request.user 
    print(user) 

После входа, если я останусь на странице и выполнять /loginCheck', команду печати отображает имя пользователя активного пользователя. Однако при обновлении страницы, если я выполняю ту же функцию, она печатает AnonymousUser. Я использовал следующие классы

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.SessionAuthentication', 
    ), 
) 

аутентификации Я использую TokenAuthentication как я также успешно сохраняющееся Facebook входа конечной точки в моей SPA. Что мне не хватает в терминах постоянного входа в Facebook?

EDIT:

Мои настройки промежуточного

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'corsheaders.middleware.CorsMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 
+0

У вас есть как SessionMiddleware, так и AuthenticationMiddleware в ваших настройках? –

+0

@ user640916, я добавил свои Middleware_classes к сообщению – Newtt

ответ

2

Если при входе с маркером, он будет действителен только для этого один цикл запроса respone. По дизайну он не должен быть постоянным, как обычные сеансы браузера Django. Поэтому для любых последующих запросов вам нужно прикрепить значение токена самостоятельно. Извлечение его из файла cookie или в зависимости от вашего клиентского приложения сохраняет его другими способами.

Вот несколько примеров кода:

var request = new XMLHttpRequest() 
request.setRequestHeader("Authorization", "Token " + token); 
request.open("GET", "foo/bar", true); 
1

Я вижу, что вы сказали, что вы используете маркер проверки подлинности системы, однако я не могу видеть его в своих классах аутентификации по умолчанию и ваших классов разрешений.

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

Я думаю, что IsAuthenticated достаточно хорош, но вы также должны проверить другие разрешения; http://www.django-rest-framework.org/api-guide/permissions/#isauthenticated.

Мои установленные приложения также содержат установленный authtoken (я не уверен, что это необходимо, поскольку я написал это некоторое время назад).

INSTALLED_APPS = { 
    ... 
    'rest_framework', 
    'rest_framework.authtoken', 
    ... 
} 

Надеюсь, что эта помощь.