Подтвердить что ты не робот

Как проверить, что пользователь уже прошел аутентификацию из tastypie?

Когда пользователь аутентифицируется в Django, как я могу проверить это на tastypie?

Как только пользователь входит в систему, представление включает в себя некоторые JS, которые извлекают данные из API, которые поддерживаются tastypie.

У меня есть базовая аутентификация /djangoauthorisation, настроенная на моих ресурсах, поэтому браузер всплывает в окне http auth. Есть ли способ избежать этого?

Моя идея до сих пор заключается в расширении BasicAuthentication, так что она сначала проверяет данные сеанса, и когда она не находит ее, она возвращается к http auth? Вызов AFAIK AJAX включает сеансовые куки, так что это теоретически должно работать? Кто-нибудь сделал что-то подобное?

4b9b3361

Ответ 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()

Я только начинаю изучать тастипию. этот код, похоже, работает для меня. Любое преимущество вашего решения?