На главную

Авторизационный proxy

Как авторизовывать несколько сервисов без написания кучи кода внутри них

Идея очень простая и уже очень давно много где реализована.

Ваше приложение находится на одном домене, скажем example.com, и вы хотите сделать так, чтобы другие ваши приложения, например app.example.com авторизовывало пользователя, если он уже авторизован на example.com.

Чтобы одно приложение авторизовывало другое можно использовать oauth. Можно для приложения на поддомене и на основном домене использовать одни и те же cookie. Но если они зашифрованы / подписаны, то надо будет раскладывать одни и те же ключи по каждому проекту. Внутри каждого проекта придётся встраивать свою аутентификацию. Дело усложнится, если это проекты написанные на разных языках.

Гораздо проще, если все ваши проекты находятся за одним прокси сервером. От shared cookie не избавиться, но можно полностью возложить аутентификацию на proxy.

Запрос из браузера направляется на прокси сервер. Прокси сервер делает подзапрос на сервис аутентификации. Аутентификационный запрос должен возвращать 401 или 200.

Если пользователь авторизован, то проксируем его в целевое приложение:

blockdiag seqdiag { browser => proxy [label = "app.example.com"] { proxy -> example.com [label = "auth request"]; proxy <-- example.com [label = "200"]; proxy => app.example.com; } } browser proxy example.com app.example.com app.example.com auth request 200

Если пользователь не авторизован, то можно 401 превратить в 302 и направить его на форму входа:

blockdiag seqdiag { browser -> proxy [label = "app.example.com"] { proxy -> example.com [label = "auth request"]; proxy <-- example.com [label = "401"]; } browser <- proxy [label = "302 to example.com login"]; browser -> proxy -> example.com [label = "example.com/login"]; } browser proxy example.com app.example.com auth request 401 302 to example.com login example.com/login example.com/login

Что писать на прокси сервере?

У nginx есть соответсвующий модуль

https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-subrequest-authentication/

У traefik также есть соответствующий модуль

https://doc.traefik.io/traefik/middlewares/http/forwardauth/

WIP

Как узнать в целевом сервисе что за пользователь к нам пришёл?

Эту информацию можно передать через заголовки.

WIP

На главную