Войти через XHR

Я хочу изменить поведение аутентификации, чтобы весь процесс мог выполняться на стороне клиента через xhr. так, например, когда я использую форму входа в систему, login_handler возвращает некоторые данные json об успехе и ошибке вместо загрузки новых html-страниц или перенаправления любого рода. что я должен посмотреть, чтобы сделать это?

3 ответа

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

Сначала извлеките своего пользователя из базы данных, подтвердите пароль, а затем, если все правильно, вы можете установить куки аутентификации:

response.headers = request.environ['repoze.who.plugins']['main_identifier'].remember(request.environ, {'repoze.who.userid':user_name})

В конце также верните JSON-диктант из контроллера, подтверждающий успех или нет для пользовательского интерфейса.

Я пытался сделать то же самое с TG2. Это расширенный ответ от Amol. Я использую его, и он прекрасно работает для меня.

@expose("json")
def login(self, login, password):

    identity = {"login": login,
                "password": password}

    # Authenticate the credentials
    username =  request.environ['repoze.who.plugins']['sqlauth'].authenticate(request.environ, identity)

    if username:
        print("Logged into " + username)
        # Remember this user
        response.headers = request.environ['repoze.who.plugins']['main_identifier'].remember(request.environ, {'repoze.who.userid':username})

        return {"status": True, "username": username}
    else:
        print("Could not authenticate")
        return {"status": False, "username": None}

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

$.ajax({
    url: "login.php",
    data: "username="+$("#username")+"&password="+$("#password"),
    method: 'GET',
    dataType: 'json',
    async: false,
    success: function(msg){
        if(msg.success){
            $("#content_area").html(msg.data);
        }
    }
});

Где скрипт будет выглядеть примерно так:

if( $_REQUEST['username'] == "correct_username" && $_REQUEST['password'] == "correct_password"){
     return json_encode( array( "success" => true, "data" => "stuff" ) );
}else{
     return json_encode( array( "success" => false ) );
}

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

Другие вопросы по тегам