Сервлеты сервера аутентификации и протокол работы с ними

Сервлеты для прямых запросов с серверов веб-приложений

Сервлеты сервера аутентификации
Figure 1. Сервлеты сервера аутентификации

Сервлет для установки стороннего куки

Протокол работы веб-приложения с сервером аутентификации

Предполагается, что каждый запрос к веб-приложению происходит в контексте идентификатора сессии приложения. Apache Tomcat, любой другой сервлет-конейнер, PHP и многие другие системы для серверного программирования предоставляют в готовом виде механизм генерации и отслеживания идентификатора сессии приложения. Этими идентификаторами уместно пользоваться при общении с сервером аутентификации.

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

  • При каждом запросе страницы веб-приложения пытаться читать куки с идентификатором сессии приложения. Если оно найдено, то это означает, что мы находимся в соответствующем контексте.

  • Если соответствующее куки не найдено, то идентификатор сессии приложения следует сгенерировать с помощью криптостойкого генератора случайных чисел и сохранить в куки.

Описание протокола:

  1. При генерации страницы приложения по запросу пользователя сервером веб-приложения вызывается сервлет /isauthenticated?sesid=…. При положительном ответе страница приложения генерируется в зависимости от прав текущего пользователя. При отрицательном ответе формируется страница с полями для ввода логина и пароля (а куки sesid считается закрытой).

  2. В любом случае страница веб-приложения должна содержать тэг:

    <img src=”адрес.сервера.аутентификации/authentication.gif?sesid=...”/>
  3. Страница веб-приложения с полями для ввода логина-пароля также должна содержать javascript, срабатывающий после загрузки страницы и определяющий, какой баннер загрузился. И если загрузился «цветной баннер», страница с полями логина-пароля должна перезагрузить сама себя (ибо так оказалось, что логин-пароль не нужен — в сторонних куках был идентификатор активной сессии аутентификации). Как Javascript узнает, какой баннер загрузился? Это можно сделать, например, если картинки будут отличаться по размеру на 1 пиксел. Узнать размер картинки можно с помощью кода:

    var pic = document.getElementById(id); var h = pic.offsetHeight;  var w = pic.offsetWidth;
  4. Страница веб-приложения должна содержать кнопку разаутентификации, вызывающую ссылку: адрес.сервера.аутентификации/logout?sesid=…​