У меня есть приложение для Android, которое взаимодействует с моим сервером, написанное на PHP. Я сделал несколько запросов, которые будут вызываться через POST из приложения для Android и будет дан ответ в формате JSON.
У меня есть запрос на вход в систему, приложение для Android отправит учетные данные (пароль и имя пользователя) на сервер. Если вход в систему выполнен успешно, session_ID будет отправлен в качестве ответа. Для каждого другого запроса, требующего аутентификации пользователя, потребуется идентификатор session_ID. Если этот идентификатор_ сессии не установлен, я предположу, что пользователь не вошел в систему. В противном случае, если идентификатор_сессии существует, я отвечу на запрос запрошенными данными.
Я собираюсь проверить аутентификацию с помощью следующего кода.
if(!isset($_POST['session_ID']))
{
$json[] = array(
'return' => $errors_authentification,
'error_msg' => "User not authenticated");
echo json_encode($json);
return;
}
session_id($_POST['session_ID']);
session_start();
Как вы думаете, это хороший подход? Я видел пост, в котором говорится о токенах вместо session_ID для взаимодействия с android — php, которые нуждаются в аутентификации. Какая разница?
Существует множество подходов к решению аутентификации пользователей после входа в систему, какой из самых новых и самых популярных JWT, JSON Web Tokens — простой способ хранения сеанса на стороне клиента таким образом, чтобы его можно было безопасно использовать со стороны сервера.
JWT гарантирует, что пользователь не сможет подделать данные, которые он отправляет на сервер, так как они исходят от сервера (например, идентификатор пользователя) и подписаны сервером.
Таким образом, вам не нужно выполнять какие-либо запросы к базе данных или около того на стороне сервера для получения идентификатора учетной записи или связанных данных, вы просто проверяете, подписаны ли данные, отправленные клиентом, вами, после того, как вы хорошо и может сэкономить некоторые циклы ЦП сервера. Тем не менее, есть небольшие накладные расходы, отправка JWT требует некоторого обмена данными, но вы можете сохранить его настолько маленьким, насколько вам нужно.
Я, например, люблю «кэшировать» некоторые данные на стороне клиента, так как токен также может использоваться в клиенте для использования этих идентификаторов.
Чтобы ответить на ваш вопрос, ваш подход прост и практически не требует усилий, также он безопасен, как куки, если вы не можете получить идентификатор в MITM Сценарий, ты хороший.
@chsharper, @pasi
Я не думаю, что JWT сам по себе достаточно безопасен. Да, он подписан сервером и гарантированно не будет подделан. Однако, если кто-то знает JWT (если он сохранен в локальном хранилище), один и тот же JWT может использоваться несколько раз в течение периода Ttl (хакер может использовать JWT и использовать для олицетворения в течение периода Ttl). Если мы сохраним JWT в файле cookie и отправим его обратно на сервер с каждым запросом, использующим HTTPS, я знаю, что сценарий немного сложный, но разве он полностью не повторяется? Я бы порекомендовал использовать одноразовый токен с JWT, чтобы он предотвращал повторяющиеся запросы.
Как вы думаете, это хороший подход? Любые идеи по этому поводу будут с благодарностью.
Спасибо,