Сегодня я внедрил систему аутентификации сеанса / токена для моего веб-API (стиль http get / post rpc), следуя этому плану:
легенда : действие (param1, param2): returnvalue1, returnvalue2
- логин (имя пользователя, пароль): сеансовый ключ, токен
- requestA (сеансовый ключ, токен, paramA): токен
- requestB (сеансовый ключ, токен, paramB): токен
- Выйти (сеансовый ключ, токен): void
Действие входа в систему отправляется через https для защиты данных пользователей. Вы получаете комбинацию сеанс / токен, где один токен действителен только для одного запроса (вы всегда получите новый токен при обычных запросах).
Мои мысли были направлены на то, чтобы уменьшить риск атаки типа «человек посередине», отнюдь ваш ключ сеанса: если вам «повезло», токен со взломом уже был признан недействительным по вашему собственному последующему запросу.
Мой бэкэнд и его юнит-тесты в порядке, но я не думал достаточно далеко - я наконец столкнулся с проблемами с асинхронными вызовами ajax, которые опровергают эту идею одноразового токена.
Стоит ли дополнительная безопасность не в состоянии обрабатывать асинхронные запросы?
Одна идея заключалась в том, чтобы ввести очередь запросов внутри моего ajax-приложения - кто-то делал что-то подобное, и вы бы порекомендовали это?
Возможно, менее безопасным, но более удобным способом было бы не обновлять токен для каждого запроса - разрешать асинхронную обработку, но сохранять исходный https-аутентификацию и добавлять строгий срок жизни к сеансу. Я также должен сохранить IP-адрес на стороне сервера сеанса.
Я пропустил другие ценные варианты?
Я привязан к существующим значениям имени пользователя / пароля, которые без исключения должны работать без изменений в новом приложении ajax.