Хорошо, я бы настоятельно рекомендовал , а не отправлять имя пользователя / пароль в виде обычного текста при любых обстоятельствах (даже при использовании SSL). Вместо этого я бы предложил использовать дайджест-форму аутентификации.
Вместо этого я бы предложил генерировать большой токен аутентификации (случайная строка большого размера, 128 символов будет работать). Затем пользователи установят этот «токен» в свое приложение.
Теперь, когда приложение проверяет наличие обновлений, оно сначала запускает запрос на ваш сервер с запросом токена дайджеста. Это случайный токен одноразового использования, который используется только для одного запроса. Ваше приложение должно сгенерировать токен, сохранить его в долговременном формате (файл, память, база данных и т. Д.) Вместе с отметкой времени, а затем отправить его обратно.
Теперь ваше приложение получает этот токен дайджеста (здесь он называется $dt
). Затем вы делаете это с предварительно настроенным токеном аутентификации, который уже был предоставлен.
$authBit = $username . ':' . $authToken;
$hash = hash_hmac('sha256', $authBit, $digestToken);
$authField = $username . ':' . $hash . ':' . $digestToken;
Затем вы отправляете $authField
на сервер. Затем сервер разделит части:
list ($user, $hash, $digestToken) = explode(':', $authField);
Теперь вы сначала просматриваете токен аутентификации пользователя в базе данных и сохраняете его в $authToken
. Затем вы просматриваете $digestToken
, чтобы убедиться, что он существует и что он был создан менее 60 секунд назад (вы можете настроить его, если он слишком короткий, но не сделать его значительно длиннее). В любом случае, удалите его из БД в этот момент (чтобы предотвратить его повторное использование).
Теперь, если $digestToken
существует и является действительным, и вы можете найти $authToken
, тогда просто выполните следующую проверку:
$stub = $user . ':' . $authToken;
if ($hash == hash_hmac('sha256', $stub, $digestToken)) {
//valid user
} else {
//Not valid
}
Преимущество заключается в изменении отправляемого токена для каждого и каждого отдельного http-запроса (любой, кто читает поток запросов, не сможет получить какую-либо конфиденциальную информацию из запроса, кроме имени пользователя, которое вы могли бы скрыть, если вы будете '' мне нравится) ...