Безопасный способ для PHP REST api? - PullRequest
1 голос
/ 19 июня 2020

Я разрабатываю PHP на основе REST api. У меня есть приложение android, которое отправит некоторые ключевые параметры на сервер, и сервер ответит данными. В этом случае электронное письмо является ключевым элементом для получения всех необходимых данных. Если я хочу сделать его безопасным, я могу сохранить пароль в sharedPreferences и отправлять его при каждом запросе. Это может сделать общение безопасным, но я понимаю, что sharedPreferences небезопасны и помещать в них конфиденциальную информацию не рекомендуется. Кроме того, я не могу сохранить ha sh пароля в sharedPreferences, потому что я использую функцию password_hash() в php api, которая требует пароль в виде простого текста. Итак, мне нужно отправить запрос только в виде простого текстового пароля. Что мне делать, чтобы обезопасить его?

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Есть обычный способ, которым это делается, и это обычно с некоторой формой аутентификации токена.

Однако вы, вероятно, захотите узнать больше о безопасности, за исключением того, что вы делаете только игрушечное приложение вы собираетесь использовать. С учетом сказанного, PHP очень хорошо справляется с сессиями, поэтому вы можете рассмотреть возможность использования ie jar-файла в своем приложении и воспользоваться преимуществами сессий. Пуристы REST, вероятно, повесят меня за это предложение, но знаете что? Он отлично работает при условии, что вы собираетесь использовать свой API только для своего приложения.

Еще одно быстрое и простое решение - выполнить обычную электронную почту и пароль для входа из вашего приложения. В случае успеха верните пользователю случайно сгенерированный токен и также сохраните его в таблице в своей базе данных. Этот токен - это то, что вы можете сохранить в sharedpref, и он будет отправляться вместе с каждым запросом. Чтобы сделать вещи более интересными, вы можете позволить токену истечь, скажем, через 10 минут, если он не использовался. В вашем приложении это будет означать, что пользователю необходимо снова войти в систему и сгенерировать новый токен.

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

$randomLongString = hash('sha384', microtime() . uniqid() . bin2hex(random_bytes(10)));

По истечении срока вы можете записать временную метку, к которой был осуществлен доступ к таблице токенов, сохранить ее в столбце с таким же токеном. Если старая отметка времени + (время истечения срока)> отметка времени сейчас, то вы знаете, что срок действия токена истек. Вернуть 401. Если не обновить старую метку времени текущей меткой времени, вернуть 200.

Это относительно простые, но эффективные решения, которые работают для настроек с одним сервером и основываются на том факте, что пользователь все еще остается тот же пользователь. Вы также можете проверить IP-адрес и идентификатор устройства перед генерацией токена. И если что-то из этого изменится по ходу дела, вы быстро аннулируете токен и предоставите пользователю возможность доказать, что он тот, кем он себя утверждает.

0 голосов
/ 19 июня 2020

OAuth2 с client_credentials GrantType, на мой взгляд, лучший вариант. Для токенов я бы использовал JWT (который используется по умолчанию в большинстве PHP реализаций), который дает вам возможность проверять его без сохранения состояния и делает ваш auth env более масштабируемым.

Вы должны авторизовать свое приложение, используя фиксированный набор учетных данных клиента (client_id и необязательный client_secret) для авторизации пользователя с его именем пользователя и паролем на сервере аутентификации. Полученный токен затем сохраняется в sharedPreferences для дальнейшей авторизации.

...