Войти через 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 и правильно выполнить аутентификацию, попробуйте это сделать.