2015-08-02 6 views
1

Итак, у меня есть API с конечной точкой, такой как POST http://localhost:8080/api/authenticate. Перейдите к этому, и вы POST email и password, и вы получите токен аутентификации. До сих пор кажется солидным.Запретить пользователям создавать токены аутентификации

Теперь как насчет регистрации. Мне нужно создать какой-то токен запроса, но как я могу помешать случайным пользователям создавать токен запроса через API? Я подумывал создать маркер с http://localhost:8080/api/request, затем вернул его и проверил, существовал ли он, когда пользователь пошел на регистрацию. Дело в том, что любой может пойти в http://localhost:8080/api/request, даже если они не планируют регистрироваться. Есть идеи?

+0

Проверяете ли вы, что адрес электронной почты/пароль в базе данных возвращает true перед выдачей автозапуска? –

+0

Это правильно. Я просто не могу найти безопасный способ генерации токенов для незарегистрированных пользователей. Поскольку это проект iOS, я пытаюсь запретить пользователям генерировать аутентификационный токен из Интернета. @JordanDavis – Idris

+0

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

ответ

0

Аутентификация пользователя перед созданием аутентификатора (cookie) ... так что напишите запрос, чтобы вывести идентификатор из таблицы пользователя, где совпадает адрес электронной почты/пароль ... поэтому, только если запрос возвращает идентификатор, тогда вы знаете, что пользователь существует и «аутентифицирован», поэтому теперь вы можете генерировать аутентификацию (cookie), устанавливая его в usrid ...

Однако настройка cookie на USB-накопитель не является хорошей практикой! так как любой пользователь на стороне клиента может легко установить/передать файл cookie с номером в запросе POST ... вам нужно реализовать некоторый механизм шифрования для генерации «сеанса», который затем можно использовать в качестве уникального взломанного идентификатора пользователя ,

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

<?php 
//CHECK IF POST DATA IS EMPTY IF SO KILL THE SCRIPT 
if(empty($_POST['email']) || empty($_POST['pass'])){ 
    //echo("error msg"); 
    die(); 
} 
$mysqli = new mysqli('localhost', 'root', 'root', 'accounts'); 
$pass = md5($_POST['pass']); 

$query = "SELECT `id` FROM `users` WHERE `email` = '" 
    . $mysqli->real_escape_string($_POST['email']) 
    . "' AND `password` = '" 
    . $mysqli->real_escape_string($_POST['pass']) . "'"; 

//INITIATE DB REQUEST 
$result = $mysqli->query($query); 
//SELECT ID(OBJ) FROM THE RESULT OBJECT 
$usrid = $result->fetch_object()->id; 
//IF $USRID IS TRUE... USER DOES EXIST (AUTHENTICATED) 
if ($usrid) { 
    $sesh = create_session($usrid); 
    update_session($usrid, $sesh); 
    setcookie("usersesh", $sesh, 0,"/"); 
} else { 
    //echo("error msg"); 
} 

$result->free(); 
$mysqli->close(); 
function create_session($usrid) { 
    $time = microtime(); 
    $hash = substr($time, 2, 3); 
    $key = $usrid * $hash; 
    $sesh = md5($key); 
    return $sesh; 
} 
function update_session($usrid, $sesh) { 
    $mysqli = new mysqli('localhost', 'root', 'root', 'accounts'); 
    $query = "UPDATE `users` SET `session` = '" 
     . $mysqli->real_escape_string($sesh) . "' WHERE `id` = '" 
     . $mysqli->real_escape_string($usrid) . "'"; 
    $mysqli->query($query); 
    $mysqli->close(); 
} 
?> 
+1

Исключить параметр '$ email', чтобы предотвратить SQL-инъекцию. – Victory

+0

Да, просто добавила записку наверху, когда вы разместили ее. –

+0

Также обратите внимание, что не рекомендуется устанавливать userid в качестве файла cookie, так как любой может создать пользовательскую клиентскую сторону и взломать его в учетной записи anyones ... поэтому то, что вы действительно хотите сделать, это создать другое поле в вашем db, называемом «session» », как только вы убедитесь, что пользователь существует и возвращает идентификатор, как в примере выше ... вы должны передать этот идентификатор простой функции, которая шифрует идентификатор через (microtime/md5), а затем обновляет поле сеанса для пользователь, а затем установите зашифрованный сеанс как токен вместо идентификатора номера. Если у вас есть время, я обновлю код и покажу вам, если вы хотите? –

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