Управление сеансом: как создать токен аутентификации для службы REST? (Джерси)
Я пытаюсь реализовать управление сеансом в своей службе REST. Я узнал эти рекомендации во время серфинга:
-
Не использовать сеансы на стороне сервера - это нарушает принцип RESTful.
-
Использование проверки подлинности HTTP Basic. Невозможно прямо сейчас, так как меня просят не использовать SSL/TLS (что, без сомнения, необходимо для Basic auth.)
-
Использование Http digest - я слышал, что это увеличивает сетевой трафик. Это звучит дорого, особенно когда мой клиент является мобильным устройством.
-
Использование файлов cookie - мне сказали, что я никогда не должен полагаться на cookie для защиты моих важных ресурсов, их можно легко подделать. Кроме того, я читал о межсайтовых скриптовых атаках через файлы cookie.
-
У меня остается возможность генерировать токен аутентификации, который пользователь должен отправлять каждый раз, что я допускаю, не полностью "RESTful".
Теперь мне нужно знать, как мне сгенерировать эти уникальные маркеры проверки подлинности, которые достаточно безопасны на уровне бизнеса? Есть ли какая-нибудь библиотека для Джерси? Должен ли я пойти на OAuth.. Я только что прочитал о них, полезны ли они в моем случае? Имейте в виду, что мои целевые клиенты - это мобильные устройства - могут ли они получить доступ к службе OAuth?
Ответы
Ответ 1
Для простоты я генерирую свой собственный токен аутентификации, используя UUID
перед тем, как зашифровать весь токен с помощью Jasypt: -
String key = UUID.randomUUID().toString().toUpperCase() +
"|" + someImportantProjectToken +
"|" + userName +
"|" + creationDateTime;
StandardPBEStringEncryptor jasypt = new StandardPBEStringEncryptor();
...
// this is the authentication token user will send in order to use the web service
String authenticationToken = jasypt.encrypt(key);
Ключ содержит creationDateTime
, чтобы я мог использовать его для проверки времени жизни. Таким образом, если пользователь использует один и тот же токен аутентификации через X минут, он больше не будет работать, и я верну 403 запрещенный код.