Как проверить, что пользователь уже прошел аутентификацию из tastypie?
Когда пользователь аутентифицируется в Django, как я могу проверить это на tastypie?
Как только пользователь входит в систему, представление включает в себя некоторые JS, которые извлекают данные из API, которые поддерживаются tastypie.
У меня есть базовая аутентификация /djangoauthorisation, настроенная на моих ресурсах, поэтому браузер всплывает в окне http auth. Есть ли способ избежать этого?
Моя идея до сих пор заключается в расширении BasicAuthentication, так что она сначала проверяет данные сеанса, и когда она не находит ее, она возвращается к http auth? Вызов AFAIK AJAX включает сеансовые куки, так что это теоретически должно работать? Кто-нибудь сделал что-то подобное?
Ответы
Ответ 1
У меня есть это решение:
class MyBasicAuthentication(BasicAuthentication):
def __init__(self, *args, **kwargs):
super(MyBasicAuthentication, self).__init__(*args, **kwargs)
def is_authenticated(self, request, **kwargs):
from django.contrib.sessions.models import Session
if 'sessionid' in request.COOKIES:
s = Session.objects.get(pk=request.COOKIES['sessionid'])
if '_auth_user_id' in s.get_decoded():
u = User.objects.get(id=s.get_decoded()['_auth_user_id'])
request.user = u
return True
return super(MyBasicAuthentication, self).is_authenticated(request, **kwargs)
который, кажется, делает то, что я хочу. Если пользователь вошел в систему, тогда сеанс содержит _auth_user_id
, если нет, ключ отсутствует.
Кто-нибудь может подумать о любых проблемах, которые может вызвать этот подход?
Ответ 2
Вы можете проверить этот билет на tastypie GitHub:
https://github.com/toastdriven/django-tastypie/issues/197
Автор предлагает очень чистый подход к аутентификации вызова с использованием как сеанса, так и методов ключа API.
Отправляется фрагмент:
class ApiKeyPlusWebAuthentication(ApiKeyAuthentication):
def is_authenticated(self, request, **kwargs):
if request.user.is_authenticated():
return True
return super(ApiKeyPlusWebAuthentication, self).is_authenticated(request, **kwargs)
def get_identifier(self, request):
if request.user.is_authenticated():
return request.user.username
else:
return super(ApiKeyPlusWebAuthentication, self).get_identifier(request)
Ответ 3
Как только пользователь войдет в систему через ваш API, у вас есть сеанс пользователя Django. Если вы хотите проверить, действительно ли пользователь все еще зарегистрирован (например, при обновлении страницы). Вы можете сделать:
from tastypie.resources import Resource
class LoggedInResource(Resource):
class Meta:
pass
def get_list(self, request, **kwargs):
from django.http import HttpResponse
if request.user.is_authenticated():
return HttpResponse(status=200)
else:
return HttpResponse(status=401)
Проверка клиента:
$.ajax({
type: "GET",
url: '/api/loggedin/',
success: function(data) {
// logged in
},
error: function() {
// not logged in
}
});
Ответ 4
Pulegium
Почему бы не просто так:
class CommAuthentication(BasicAuthentication):
def __init__(self, *args, **kwargs):
super(CommAuthentication, self).__init__(*args, **kwargs)
def is_authenticated(self, request, **kwargs):
return request.user.is_authenticated()
Я только начинаю изучать тастипию. этот код, похоже, работает для меня. Любое преимущество вашего решения?