Всем привет
Пишу набор приложений для одной и той же организации, всё на python+flask+mod_wsgi
Есть у меня горячее желание сделать SSO следующим образом:
- при заходе на сайт xxx.example.loc проверяется наличие токена в запросе (например, sso_token, хранящийся в cookies)
- если токена нет, происходит редирект на что-то типа auth.example.loc
- auth.example.loc выполняет аутентификацию по определённым правилам и устанавливает токен в случае успеха, потом редиректит обратно
- xxx.example.loc читает токен, радуется и продолжает работу
Вопрос, собственно, в правилах аутентификации. Сейчас сделано так:
- аутентификация с помощью mod_auth_kerb
- mod_auth_kerb устанавливает внутреннюю апачевскую переменную r->user, которую читает mod_lookup_identity и запрашивает через sssd-dbus данные этого пользователя (убираем логику работы с ldap из приложения)
- mod_lookup_identity выставляет набор переменных окружения
- если krb-аутентификация неудачная, показывается форма, данные которой перехватываются через mod_intercept_form_submit, выпоняется аутентификация через mod_authnz_pam, в случае успеха mod_lookup_identity опять же выставляет переменные окружения
Всё хорошо, пока мы остаёмся в пределах одного воркера - переменные окружения всегда в интерпретаторе и мы можем их прочитать. А вот если разделить аутентификацию и сервис, то получится, что переменные будут выставляться в процессе другого интерпретатора. Можно, конечно, попробовать WSGIApplicationGroup выставить так, чтобы всё исполнялось в одном и том же интерпретаторе, но тогда приложения менее изолированы и уже не получится их, к примеру, разнести на разные сервера.
В голову пришла идея записать пользовательские данные в токен. Но хорошо ли это:
- токен разрастается в размерах
- больше данных хранится у пользователя => больше риск компрометации
Другая мысль - сделать сервис типа userdata.example.org, который по uid отдавал бы нужные данные.
Посоветуйте, пожалуйста, что лучше? Может, что-то другое?
sso через клиентские сертификаты сделать пока не могу - freeipa не умеет выдавать сертификаты клиентам. Да и с kerberos возни меньше.
Заранее спасибо