#android #https #auth
Клиент-серверное приложение. Решили сделать на сервере авторизацию по логину-паролю. Мне не понятен сам механизм как это работает. Каков должен быть мой алгоритм действий в этом случае. Более-менее разобрался как подключиться к серверу по http, получить данные json, распарсить и показать в листвью. А вот с авторизацией затык вышел. Буду рад конструктивному ответу.
Ответы
Ответ 1
Допустим, что get/post уже умеете делать (post нужно объязательно научиться, так как get запросы могут кешироваться и все запросы, которые изменяют данные - не должны использовать get). Итак, при старте приложение должно проверить, если в настройках сохранненный ключ (у нас это будет просто строка). Если есть, то пробуем им выполнить тестовый запрос, передав его как то на сервер. Если это get запрос, то можно передать в параметрах урла: http://example.com/rest/init?key=123123123&data=testtest здесь 123123123 - это ключ (как его получить - будет ниже). а data = testtest - какие то произвольные данные. Ну мало чего нам понадобиться. Но для этого запроса может и не быть больше данных. Другие запросы выглядят точно также, только урл изменяется. Например, выбрать из базы данные по продавцу boo может выглядеть так http://example.com/rest/vendor?key=123123123&name=boo на стороне сервера нужно прочитать этот ключ. И проверить. Сами ключи можно хранить в базе. Допустим, что на сервере у нас php (а он там обычно и есть). Поэтому, нужна функция проверки ключа function check_key($key) { # делаем запрос к базе, # проверяем и возвращаем return true; # false } а в начало каждой защищенной функции вставляем такое if (!check_key(_GET['key']) { header("HTTP/1.0 401 Unauthorized"); return; } # все ок, можно сделать запрос и отдать данные я специально возвращают 401 код, который значит то, что ключ плохой или не верный. По хорошему, эти две ситуации нужно различать. Но "и так сойдет(с)". Клиент, получив ошибку, должен либо прекратить попытки, либо попросить пользователя ввести имя пароль (и потереть старый ключ, если он был). Теперь осталось последнее - нужно по имени-паролю получить ключ. Со стороны клиента все просто - передаем в каком-то виде их на сервер. Очень хочется это все запихнуть в get запрос: http://example.com/rest/get_key?login=user&password=pass Но это НЕПРАВИЛЬНО. Правильно передавать внутри post запроса. Тут есть много способов, например, передать как json или как обычную форму. На стороне сервера этот конткретный урл не должен быть защищен кодом выше (как бы это не казалось очевидным, но многие делают подобную ошибку и долго удивляются). Как вычитать имя пароль, проверить их по базе - это просто - обычно один запрос. Если все ок - просто возвращаем назад ключ (который нужно не забыть запомнить в базе, а то как проверять?). Но где же взять сам ключ? Самое простое - сгенерировать его случайным образом. самый простой-простой вариант - md5 от текущего времени (но это плохой вариант - злоумышленник может попробовать угадать его). Да, описанное здесь слишком примитивно и для многих покажется слишком утрированным. Но оно нужно для того, что бы понять базу. Многие думают, что для мобильного приложения нужны какие то особые технологии/методы. Это не правильно. При правильном подходе, серверу все равно, кто к нему подключается (но это не значит, что мобильному клиенту можно отправить пару гигов json просто так). Поэтому, с серверной стороны не нужно искать "особого специалиста". Что нужно научиться делать на клиенте: объязательно: http get/post запросы сохранять данные в локальной базе/конфигах желательно: генерировать/парсить json/xml освоить потоки или asyncОтвет 2
Опишу стандартный механизм авторизации через пару login/password: Нужен https - если его нет, то все делается по другому Формируем json строку содержащую пару login/password и шлем серверу Сервер генерирует hash(password+salt) - hash() - обычно что-то типа PBKDF2 Сервер смотрит у себя в БД по ключу login и находит хэш password+salt сравнивает его с вычисленным на шаге 3. Если авторизация успешная, сервер генерирует случайный token, который отдает обратно клиенту Далее клиент все свои запросы сопровождает полученным от сервера токеном, если запрос приходит без токена или токен просроченный - запрос отклоняется.Ответ 3
Для авторизации клиента и идентификации его как пользователя, за частую используют куки (Cookie). В них передает "ключ", как правило session_id - который генерируется при подключении клиента к вашему http серверу. так же value данной куки передается в БД, storage ( по вашему желанию ) как идентификатор пользователя. Само собой, у каждого клиента свой уникальный session_id
Комментариев нет:
Отправить комментарий