Как я могу проверить, что пользователь уже прошел проверку на вкусном пироге? - PullRequest
12 голосов
/ 09 сентября 2011

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 09 сентября 2011

У меня пока есть такое решение:

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, если нет, ключ отсутствует.

Кто-нибудь может подумать о любых проблемах, которые может вызвать этот подход?

9 голосов
/ 30 ноября 2011

Вы можете проверить этот билет на GitHub tastypie's:

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)
1 голос
/ 12 марта 2013

Как только пользователь войдет в систему через ваш 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
    }
});
0 голосов
/ 17 декабря 2011

Пулегиум

Почему бы не так просто, как показано ниже:

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()

Я только начинаю изучать вкусный пирог.приведенный выше код работает для меня.Есть ли преимущество у вашего решения?

...