Как управлять аутентификацией/авторизацией для пользовательских запросов, отправленных из родных мобильных приложений, вызывающих Play2! - Scala Услуги REST

Я врывался в документацию Play2! Scala о возможных способах реализации аутентификации/авторизации для пользовательских запросов, и я должен сказать, что я немного потерял. Я хотел бы узнать больше о том, как запросы, отправленные с мобильных устройств, проходят аутентификацию/авторизацию в службе REST-сервиса Play2! Scala -backed.

Прежде всего, кажется, что для Play2/ scala существует много auth-модулей: например, t2v Play20-auth. Но дело в том, что эти решения основаны на хранении файлов cookie на стороне клиента. Это правильно? Что имеет смысл в чистой веб-перспективе: запросы отправляются из браузера, сервер может хранить файлы cookie на клиенте и т.д.

Теперь, если у меня есть родное мобильное приложение (на IOS или Android), и я просто звоню в службу REST, поддерживаемую приложением Play2! Scala. В этом случае я не пользуюсь браузером, поэтому сервер не может хранить файлы cookie в клиентском приложении.

Могу ли я использовать модули типа t2v Play20-auth для авторизации/аутентификации?

Каковы наилучшие методы работы с такими вещами?

Любая помощь будет действительно оценена, Спасибо заранее,

Ответ 1

Хорошо, это для аутентификации, тогда логин является отдельным, вы можете использовать свою собственную систему или что-то вроде openID и т.д. Проблема заключается в том, как сохранить, что пользователь аутентифицирован.

Основной идеей обеспечения безопасности службы REST будет использование токена аутентификации, подписанного на стороне сервера с некоторым идентификатором пользователя. Это будет идти следующим образом:

  • пользователь вводит идентификатор/пароль
  • метод rest проверяет это и, если он действителен, отправляет токен обратно на телефон. Вы сохраняете это в своем приложении.
  • каждый раз, когда вы звоните в ваш API для отдыха, вы отправляете идентификатор пользователя и токен, и вы проверяете токен на сервере.

У вас есть два решения для генерации и проверки токенов:

  • Токен - это, в основном, идентификатор пользователя, объединенный со своей собственной солью (любое секретное сообщение, которое вы хотите), а затем подписанный с закрытым ключом на вашем сервере. Лично я сделал это с HMAC-SHA256 (используя javax.crypto в моем коде scala). Если кто-то пытается использовать ваш REST API, они не смогут генерировать токен, поскольку они не знают ваш секретный ключ и секрет. Каждый раз, когда вы получаете запрос на свой REST API (3), вы просто пересчитываете хэш и сравниваете его с тем, который вы отправили в качестве токена.
  • Вместо HMAC с идентификатором пользователя другое решение - хранить случайное число в вашей базе данных для каждого пользователя. Это будет ваш токен. Каждый раз, когда вы получаете запрос, вы проверяете в базе данных секретный токен для этого пользователя и видите, совпадает ли он с запросом.

Это создаст бесконечные токены, поэтому ваш пользователь никогда не будет выходить из системы, вы можете легко добавить дату истечения срока действия для этих решений:

  • если вы используете HMAC, вы помещаете в свой токен (перед подписанием) текущую дату. Например, если вы хотите 24-часовой сеанс, вы можете сделать что-то вроде:

    val format = new SimpleDateFormat("d/M/yyyy");  
    isoFormat.setTimeZone(TimeZone.getTimeZone("UTC"));  
    val date = format.format(new Date());  
    val token = calculateHMAC(userID + date + secret);  
    

    для более коротких/более длительных периодов, вы изменяете формат, чтобы включить более или менее, чтобы каждый раз, когда вы генерируете токен, чтобы проверить его, вы попадаете в тот же период.

  • для решения случайных чисел/баз данных, вы просто сохраняете дату создания случайного токена, и видите ли это в интересующем вас периоде.

Если вы используете идентификатор OpenID (или аналогичный) от третьего лица, вам нужно будет показать WebView пользователю, на котором вы загружаете страницу поставщика OpenID, вам просто нужно убедиться, что страница перенаправления после аутентификации содержит сгенерированный токен, скрытый где-то (в заголовке, например), и вы извлекаете его с кодом приложения.

Это довольно просто реализовать, но я видел плагин для play2 для работы с токеном auth: https://github.com/orefalo/play2-authenticitytoken (никогда не используется персонально) и один для аутентификации без гражданства: https://github.com/blendlabs/play20-stateless-auth

Для бит loggin вам не нужно реализовывать это, есть хорошие модули для игры: