2012-06-26 1 views
4

Это довольно простой вопрос - хотя тот, который сейчас на уме, я начинаю свой первый реальный и довольно грандиозный (с точки зрения размера) проект.Как аутентифицировать пользователя через Ajax-запросы или на каждой загрузке страницы?

Как я могу проверить идентификацию пользователя (имя пользователя и пароль) при отправке Ajax request через PHP? Похоже, есть простое решение: отправить как имя пользователя, так и пароль как POST variables вместе с остальными в запросе, но мне кажется, что решение довольно неэффективно (так как оно должно проверять базу данных каждый раз, когда запрос сделано и будет достаточно избыточным для разных запросов Ajax).

Я изучил, как Twitter выполняет свои Ajax-запросы (например, для публикации нового твита), и я не вижу в них отправки какой-либо информации аутентификации в запросе, но как они знают, что это на самом деле я, владелец моего профиля, отправив запрос Ajax, чтобы опубликовать новый твит?

Если это помогает любому придумать отличное решение - я использую библиотеку JQuery AJAX и фреймворк CodeIgniter PHP.

Спасибо!

+0

Возможно, используются файлы cookie? Просто догадка. –

+0

Да, используйте файлы cookie. отправка полного имени пользователя и пароля через plaintext/json небезопасна. по крайней мере, используйте зашифрованную хеш-соль. – FlavorScape

+0

Может быть, но я в этом сомневаюсь. Файлы cookie могут быть взломаны, а пользователи могут выдавать себя за код. – heapoverflow

ответ

5

Запросы Ajax точно такие же, как и любой другой HTTP-запрос. Будь то это делается с помощью JavaScript или путем ввода URI в адресную строку вашего браузера, все они являются HTTP-запросами.

Вы правы, что отправка имени пользователя и пароля через HTTP является неправильным решением. Однако при отправке имени пользователя/пароля обычно необходимо после, но это должно быть сделано только на HTTPS, чтобы он не отправлялся как обычный текст. После аутентификации вы можете сохранить идентификатор пользователя в переменной сеанса сервера для доступа в будущих запросах.

Немного псевдо-код, чтобы помочь вам на этом пути:

if(!empty($_SESSION["userId"])) { 
    // User is authenticated. Do something. 
} 
else if(!empty($_POST["username"])) { 
    // User is attempting to log in. Check against database. 
    $userId = getUserIdByUsernamePassword($_POST["username"], $_POST["password"]); 

    // Store user id in session variable. 
    if($userId > 0) { 
     $_SESSION["userId"] = $userId; 
    } 
} 
else { 
    // User is not authenticated. 
} 

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

Использование переменных сеанса в PHP, cookie is используется, однако оно не идентифицирует пользователя вообще, скорее идентифицирует соединение между клиентом и сервером.

Но для успешной аутентификации проектов реального мира не следует полагаться на сеансовые куки. Скорее, комбинация переменной сеанса, файла cookie UUID и файла соленой хэши может увеличить целостность аутентификации ... но это совсем другая тема.

0

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

+0

Да, но я все равно могу отправить Чирикать от имени другого человека (олицетворение), поскольку единственная проверка будет, если я войду в систему - если я правильно вас пойму. – heapoverflow

+0

Ну, вы также должны убедиться, что выполняемый запрос выполняется человеком, на которого он влияет. – johnmadrak

Смежные вопросы