Как реализовать авторизацию на Android + PHP API?

Всем привет.

Возник вопрос, как правильно и безопасно реализовать авторизацию в приложении Android на удаленном сервере с REST (по крайней мере, хотелось бы в это верить :)) API, написанном на PHP.

Сейчас схема следующая:

1. Пользователь вводит логин и пароль, они с помощью POST запроса отправляются на сервер (адрес вида www.mysite.com/api/v1/login).
2. Если все ок (логин и пароль верные) - сервер возвращает информацию о пользователе (имя, дата регистрации и т.д.) наряду с ApiKey - этот ключ генерируется случайным образом в момент регистрации пользователя.
3. Все операции в приложении происходят с использованием этого ApiKey - он отдается серверу в заголовке GET/POST/PUT запроса в поле Authorization. Сервер смотрит его в БД, если не находит - выдает HTTP 401.

Необходимо реализовать некий механизм в приложении вроде галочки "Запомнить меня". Т.е. если пользователь успешно залогинился - не спрашивать его больше логин и пароль, пока он принудительно не нажмет некую кнопочку "Выйти". Хранить связку логин/пароль в SharedPreferences или sqlite небезопасно, также как и хранить там ApiKey.

Подскажите, пожалуйста, если ли какие-то специально для этого предназначенные места? Или, может быть, собака зарыта где-то в другом месте?

Заранее спасибо за ответ :)
  • Вопрос задан
  • 17100 просмотров
Пригласить эксперта
Ответы на вопрос 4
@moved_on
Почти год прошел, но все же)

Я сейчас делаю так. логинится пользователь, создаем сессию для него, ключ сессии - в куки. Вметсе с ним в куки зашифрованный функцией crypt токен - его в базу. закончилась сессия - расшифровываем токен и проверяем. нормально - выдаем новый сес ключ, не подходит - пошел вон)
Ответ написан
Храните хеш от логина и пароля. и отправляйте его на сервер после 401 или для авторизации.
Ответ написан
deadbyelpy
@deadbyelpy
веб-шмеб
Интересно, из каких размышлений исходили когда придумали штуку с ApiKey который генерируется 1 раз при регистрации?

Пароль и логин не хранят на клиенте все верно. ApiKey ваш, тоже.
Посмотрите на то как реализована авторизация у сложных систем, ведь у них везде есть токен сессии. Рекомендую и вам его использовать.

Схема такая: на сервере, как то, где то храните токены пользователей. У токена есть время завершения сессии. например пару дней.

При каждом запросе передается этот токен и продлеваете время сессии, на текущее время + ваш срок истечения сессии. Если передали устаревший токен, пишите в лог подозрительные данные.

Получается такая ситуация. Пользователь активный - можно авторизоваться лишь раз.
Пользователь заходит раз в неделю, что уж извольте авторизуйтесь. Токен само собой хранить на устройстве и желательно его зашифровать.
Используйте HTTPS, но можно еще и такое придумать. Ключ шифрования - ваш ApiKey который знает устройство и знает сервер. В таком случае при передаче через сеть он непонятен.
Ответ написан
@Unkow
API KEY, который генерируется при регистрации, можно вообще ему срок годности не задавать, просто токен, который всегда действителен, единственное можно написать функцию для смены этого токена, ну если пользователи захочет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы