Přeskočit obsah

HTTP Cookies 🍪

SeaCat Auth poskytuje autentizaci založenou na cookies pro aplikace, které neimplementují OAuth2. Pro jednodoménové a vícedoménové nastavení je potřeba odlišná konfigurace.

Jednodoménové nastavení

Pokud všechny aplikace, které chcete chránit, běží na stejné doméně jako vaše služba SeaCat Auth (nebo její subdomény), musíte nakonfigurovat pouze hlavní cookie. Tato cookie je uživateli automaticky odeslána po úspěšném přihlášení.

Konfigurace služby

Hlavní cookie je nakonfigurována v sekci [seacatauth:cookie]. Dostupné možnosti konfigurace jsou: - name: Název cookie, výchozí hodnota je SeaCatSCI - domain: Doména cookie. Nemá žádnou výchozí hodnotu a musí být explicitně nakonfigurována.

POZNÁMKA: Aby cookie fungovala ve všech hlavních prohlížečích, musí doména cookie obsahovat alespoň dvě tečky (požadavek od Firefoxu). Například localhost nebo .xyz nemusí fungovat správně, ale .app.localhost nebo .example.xyz by měly fungovat bez problémů.

Příklad

[seacatauth:cookie]
domain=.service.xyz

Taková cookie je platná na doméně service.xyz a všech jejích subdoménách a subcestách, například auth.service.xyz nebo myapp.test.service.xyz/example.

Introspekce cookie je způsob autentizace a autorizace požadavků na chráněné místo. Každý uživatelský požadavek na takové místo je kontrolován, zda má platnou cookie SeaCat Auth v hlavičce. Pokud ano, požadavek pokračuje na chráněné místo. Pokud nemá platnou cookie, je uživateli odeslána odpověď HTTP 401 Not Authorized. Nebo může být uživatel přímo přesměrován na koncový bod autorizace.

Koncový bod introspekce cookie se nachází na cestě /nginx/introspect/cookie a používá POST požadavky. Dále má schopnost přidávat určité informace o uživateli do HTTP X-hlavic, například uživatelské jméno, role nebo nájemce. To se provádí pomocí add= dotazových parametrů v introspekčním volání. Podívejte se na kolekci SeaCat Auth Postman pro více informací o tomto koncovém bodu.

Konfigurace koncového bodu introspekce:

location = /_cookie_introspect {
    internal;
    proxy_method          POST;
    proxy_set_body        "$http_authorization";
    proxy_pass            <SEACAT_AUTH_SERVICE_URL>/nginx/introspect/cookie;
    proxy_ignore_headers  Cache-Control Expires Set-Cookie;
}

Příklad konfigurace chráněného místa pomocí cookie:

location / {
    proxy_pass <PROTECTED_LOCATION_URL>;

    auth_request        /_cookie_introspect;
    auth_request_set    $authorization $upstream_http_authorization;
    proxy_set_header    Authorization $authorization;
}

Vícedoménové nastavení

Pokud některé z vašich aplikací běží na jiných doménách než služba SeaCat Auth, musíte nastavit aplikaci cookie a koncový bod pro vstup cookie pro každou z těchto domén. Na rozdíl od hlavní cookie nejsou tyto cookies automaticky vydávány po přihlášení. Aby je bylo možné získat, je nutné provést volání požadavku na cookie.

❓ TODO: Tok uživatele bez autentizace ❓

  • Uživatel se pokouší přistupovat k chráněnému místu bez požadované aplikace cookie
  • Introspekce cookie NGINX selže a uživatel je přesměrován na koncový bod OIDC autorizace
  • Koncový bod autorizace přesměrovává uživatele na přihlašovací obrazovku
  • Uživatel se přihlásí
  • Uživatel je přesměrován na koncový bod žádosti o aplikaci cookie s autentizačním kódem v dotazovacím řetězci
  • Koncový bod žádosti o cookie vymění autentizační kód za cookie a přesměruje uživatele na předem nakonfigurovanou URL

Konfigurace

Každá cookie je nakonfigurována ve své vlastní sekci nazvané [seacatauth:cookie:<APP_DOMAIN_ID>]. <DOMAIN_ID> se používá v URL požadavku na cookie pro odpovídající doménu.

[seacatauth:cookie]
; Toto je hlavní cookie, je vyžadována jak v jednodoménovém, tak ve vícedoménovém nastavení
domain=auth.service.xyz

[seacatauth:cookie:myservice]
domain=my.service.xyz
redirect_uri=http://my.service.xyz/home

[seacatauth:cookie:anotherservice]
domain=service.elsewhere.xyz
redirect_uri=http://service.elsewhere.xyz/discover

redirect_uri určuje, kam je uživatel přesměrován po úspěšném požadavku na cookie.

GET /cookie/entry/<APP_DOMAIN_ID>

Vyměňuje autorizační kód za aplikaci cookie. Je nutné poskytnout dotazové parametry grant_type=authorization_code a code=...... v požadavku.

Např.:

GET http://my.service.xyz/auth/cookie/entry/myservice?grant_type=authorization_code&code=4x0fDvBTuSM3dWlp7t2560A4wtCB199dcbLU5pphe8AagCpM

Konfigurace NGINX

Každá z nakonfigurovaných domén musí mít proxy na introspekci cookie a požadavek na cookie koncové body. Koncový bod introspekce je nakonfigurován přesně stejně jako v případě jednodoménového nastavení:

location = /_cookie_introspect {
    internal;
    proxy_method          POST;
    proxy_set_body        "$http_authorization";
    proxy_pass            <SEACAT_AUTH_PUBLIC_API_INTERNAL_URL>/nginx/introspect/cookie;
    proxy_ignore_headers  Cache-Control Expires Set-Cookie;
}
  • <SEACAT_AUTH_PUBLIC_API_INTERNAL_URL> je interní základní URL vaší veřejné API SeaCat Auth.

Místa, která používají introspekci cookie, by měla nastavit svou chybovou stránku na koncový bod OIDC autorizace s scope=openid&response_type=code pro automatické vyzvání k přihlášení. URL pro přesměrování by měla směřovat na požadavek na cookie koncový bod s grant_type=authorization_code:

server_name <APP_DOMAIN>

...

location /auth/cookie_entry {
    proxy_pass <SEACAT_AUTH_PUBLIC_API_INTERNAL_URL>/cookie/entry/<APP_DOMAIN_ID>;
}
  • <APP_DOMAIN> je vaše aplikační doména, odlišná od domény SeaCat Auth.
  • <APP_DOMAIN_ID> je ID vaší aplikační domény, jak jste ji nakonfigurovali v konfiguraci služby SeaCat Auth.
  • <SEACAT_AUTH_PUBLIC_API_INTERNAL_URL> je interní základní URL vaší veřejné API SeaCat Auth.
location / {
    proxy_pass <PROTECTED_LOCATION_URL>;

    auth_request        /_cookie_introspect;
    auth_request_set    $authorization $upstream_http_authorization;
    proxy_set_header    Authorization $authorization;

    error_page 401 403 <SEACAT_AUTH_PUBLIC_API_URL>/openidconnect/authorize?response_type=code&scope=openid&client_id=signin&redirect_uri=<APP_DOMAIN>/auth/cookie_entry?grant_type=authorization_code;
}
  • <PROTECTED_LOCATION_URL> je interní URL vašeho chráněného místa.
  • <SEACAT_AUTH_PUBLIC_API_URL> je veřejné základní URL vaší veřejné API SeaCat Auth.