python - аутентификация django - анонимный пользователь после входа в систему - PullRequest
0 голосов
/ 25 мая 2018

У меня есть сервер django, который действует как API (т.е. слушает запросы и возвращает данные ТОЛЬКО), и я хочу, чтобы этот API был доступен только для аутентифицированных пользователей.Я прочитал о системе аутентификации django и попытался реализовать ее в соответствии с документацией (https://docs.djangoproject.com/en/2.0/topics/auth/default/).

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

Я использую Python 3.6.5 и Django 2.0.4

Код сервера:

@csrf_exempt
def dologin(request):
    username = request.POST.get('username')
    password = request.POST.get('password')
    if not username or not password:
        return HttpResponse('missing username or password', status=400)
    user = authenticate(request, username=username, password=password)
    if user is not None:
        login(request, user)
        return HttpResponse(user)
    else:
        return HttpResponse('bad credentials', status=422)

def dologout(request):
    logout(request)
    return HttpResponse('success')

@login_required()
def testAccess(request):
    return HttpResponse('ok')

def checkUser(request):
    u = "anonymous" if not request.user.is_authenticated else request.user.username
    return HttpResponse(u)

Код клиента:

<label>username:</label>
<input type="text" id="uin"/>
<label>username:</label>
<input type="text" id="pin"/>
<button id="inbtn">login</button>
<button id="outbtn">logout</button>
<button id="test">test access</button>
<button id="check">check user</button>

<div id="res"></div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js" type="text/javascript"></script>
<script>
    $("#inbtn").click(function(){
        u = $("#uin").val();
        p = $("#pin").val();
        d = {username: u, password: p};
        $.post("http://10.0.0.9:8000/login/", d, function(data){
            $("#res").html(data);
        }).fail(function(xhr, status, error){
            $("#res").html(xhr.responseText + " - " + xhr.status);
        });
    });

    $("#outbtn").click(function(){
        $.get("http://10.0.0.9:8000/logout/", function(data){
            $("#res").html(data);
        }).fail(function(xhr, status, error){
            $("#res").html(xhr.responseText + " - " + xhr.status);
        });
    });

    $("#test").click(function(){
        $.get("http://10.0.0.9:8000/testaccess/", function(data){
            $("#res").html(data);
        }).fail(function(xhr, status, error){
            $("#res").html(xhr.responseText + " - " + xhr.status);
        });
    });

    $("#check").click(function(){
        $.get("http://10.0.0.9:8000/checkuser/", function(data){
            $("#res").html(data);
        }).fail(function(xhr, status, error){
            $("#res").html(xhr.responseText + " - " + xhr.status);
        });
    });
</script>

(я все запускаю локально, поэтому я использую 10.0.0.9, который является моимip компьютера)

Как я уже писал ранее - после успешного входа в систему, нажав «проверить доступ», вы получите ответ 404, а «проверить пользователя» вернет «анонимный» (и отладив сервер, которого я знаю, пользователь)действительно AnonymousUser)

1 Ответ

0 голосов
/ 25 мая 2018

Я подозреваю, что ваша проблема с данными сеанса.

После аутентификации и входа в систему пользователь устанавливается в пределах одного сеанса django .Файл cookie HTTP (по умолчанию с именем sessionid) будет установлен с номером сеанса.

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

Вы должны прочитать о том, как получить файл cookie sessionid после входа в систему и как отправить тот же sessionid вместе с новыми запросами.

...