LINUX.ORG.RU

Как лучше сделать sso для набора приложений?

 , , ,


0

2

Всем привет

Пишу набор приложений для одной и той же организации, всё на python+flask+mod_wsgi

Есть у меня горячее желание сделать SSO следующим образом:

  1. при заходе на сайт xxx.example.loc проверяется наличие токена в запросе (например, sso_token, хранящийся в cookies)
  2. если токена нет, происходит редирект на что-то типа auth.example.loc
  3. auth.example.loc выполняет аутентификацию по определённым правилам и устанавливает токен в случае успеха, потом редиректит обратно
  4. xxx.example.loc читает токен, радуется и продолжает работу

Вопрос, собственно, в правилах аутентификации. Сейчас сделано так:

  1. аутентификация с помощью mod_auth_kerb
  2. mod_auth_kerb устанавливает внутреннюю апачевскую переменную r->user, которую читает mod_lookup_identity и запрашивает через sssd-dbus данные этого пользователя (убираем логику работы с ldap из приложения)
  3. mod_lookup_identity выставляет набор переменных окружения
  4. если krb-аутентификация неудачная, показывается форма, данные которой перехватываются через mod_intercept_form_submit, выпоняется аутентификация через mod_authnz_pam, в случае успеха mod_lookup_identity опять же выставляет переменные окружения

Всё хорошо, пока мы остаёмся в пределах одного воркера - переменные окружения всегда в интерпретаторе и мы можем их прочитать. А вот если разделить аутентификацию и сервис, то получится, что переменные будут выставляться в процессе другого интерпретатора. Можно, конечно, попробовать WSGIApplicationGroup выставить так, чтобы всё исполнялось в одном и том же интерпретаторе, но тогда приложения менее изолированы и уже не получится их, к примеру, разнести на разные сервера.

В голову пришла идея записать пользовательские данные в токен. Но хорошо ли это:

  • токен разрастается в размерах
  • больше данных хранится у пользователя => больше риск компрометации

Другая мысль - сделать сервис типа userdata.example.org, который по uid отдавал бы нужные данные.

Посоветуйте, пожалуйста, что лучше? Может, что-то другое?

sso через клиентские сертификаты сделать пока не могу - freeipa не умеет выдавать сертификаты клиентам. Да и с kerberos возни меньше.

Заранее спасибо


OAuth 1/2 server + userinfo endpoint.

anonymous
()
Ответ на: комментарий от anonymous

Спасибо тебе, мил человек! Остановлюсь на JWT, ибо читал про него давно, руки чесались применить, да тут ещё и вкуснота для питона готовая https://pypi.python.org/pypi/PyJWT

Городить свой oauth сервер в этот раз кажется оверкиллом

hc
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.