docs: add OIDC cross-zone redirect diagram to sso-and-identity.md

Sequence diagram showing the browser carries every hop itself -
Authentik and the app never talk directly - with only the OAuth
authorize/token exchange crossing from the browser-facing zone into
the service-to-service zone. Built to the public-repo diagram
conventions in CLAUDE.md (labelBackgroundColor + matching rich-text
span, off-line label positioning, line-color-matched labels, legend
instead of a color-explaining caption).
This commit is contained in:
thesabear committed 2026-08-28 00:17:29 +03:00
1 parent dfc8a6abab
commit f68f93af64
2 files changed
+6

No files matched your search

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Do not edit this file with editors other than draw.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent; color-scheme: light dark;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="907px" height="661px" viewBox="0 0 907 661" content="&lt;mxfile host=&quot;embed.diagrams.net&quot; scale=&quot;1&quot; border=&quot;0&quot;&gt;&#10; &lt;diagram name=&quot;OIDC Cross-Zone Redirect&quot; id=&quot;oidc-redirect-2&quot;&gt;&#10; &lt;mxGraphModel dx=&quot;1414&quot; dy=&quot;791&quot; grid=&quot;1&quot; gridSize=&quot;10&quot; guides=&quot;1&quot; tooltips=&quot;1&quot; connect=&quot;1&quot; arrows=&quot;1&quot; fold=&quot;1&quot; page=&quot;1&quot; pageScale=&quot;1&quot; pageWidth=&quot;1000&quot; pageHeight=&quot;760&quot; math=&quot;0&quot; shadow=&quot;0&quot;&gt;&#10; &lt;root&gt;&#10; &lt;mxCell id=&quot;0&quot; /&gt;&#10; &lt;mxCell id=&quot;1&quot; parent=&quot;0&quot; /&gt;&#10; &lt;mxCell id=&quot;band-local&quot; parent=&quot;1&quot; style=&quot;rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;verticalAlign=top;fontStyle=1;fontSize=12;fontColor=#333333;opacity=40;&quot; value=&quot;BROWSER-FACING ZONE — *.local.thesabear.net&quot; vertex=&quot;1&quot;&gt;&#10; &lt;mxGeometry height=&quot;560&quot; width=&quot;260&quot; x=&quot;60&quot; y=&quot;60&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;band-caddy&quot; parent=&quot;1&quot; style=&quot;rounded=0;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;verticalAlign=top;fontStyle=1;fontSize=12;fontColor=#333333;opacity=40;&quot; value=&quot;SERVICE-TO-SERVICE ZONE — *.caddy.thesabear.net (no mTLS on this hop)&quot; vertex=&quot;1&quot;&gt;&#10; &lt;mxGeometry height=&quot;560&quot; width=&quot;260&quot; x=&quot;680&quot; y=&quot;60&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;browser&quot; parent=&quot;1&quot; style=&quot;rounded=1;whiteSpace=wrap;html=1;fillColor=#F5F5F5;strokeColor=#666666;fontColor=#333333;fontSize=14;fontStyle=1;shadow=1;&quot; value=&quot;Browser&quot; vertex=&quot;1&quot;&gt;&#10; &lt;mxGeometry height=&quot;50&quot; width=&quot;160&quot; x=&quot;420&quot; y=&quot;80&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;app&quot; parent=&quot;1&quot; style=&quot;rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontColor=#333333;fontSize=14;fontStyle=1;shadow=1;&quot; value=&quot;App&quot; vertex=&quot;1&quot;&gt;&#10; &lt;mxGeometry height=&quot;50&quot; width=&quot;140&quot; x=&quot;120&quot; y=&quot;100&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;authentik&quot; parent=&quot;1&quot; style=&quot;rounded=1;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;fontSize=14;fontStyle=1;shadow=1;&quot; value=&quot;Authentik&quot; vertex=&quot;1&quot;&gt;&#10; &lt;mxGeometry height=&quot;50&quot; width=&quot;140&quot; x=&quot;740&quot; y=&quot;100&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;ll-app&quot; edge=&quot;1&quot; parent=&quot;1&quot; style=&quot;endArrow=none;dashed=1;html=1;strokeColor=#999999;&quot;&gt;&#10; &lt;mxGeometry relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10; &lt;mxPoint x=&quot;189.58&quot; y=&quot;160&quot; as=&quot;sourcePoint&quot; /&gt;&#10; &lt;mxPoint x=&quot;189.58&quot; y=&quot;590&quot; as=&quot;targetPoint&quot; /&gt;&#10; &lt;/mxGeometry&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;ll-browser&quot; edge=&quot;1&quot; parent=&quot;1&quot; style=&quot;endArrow=none;dashed=1;html=1;strokeColor=#999999;&quot;&gt;&#10; &lt;mxGeometry relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10; &lt;mxPoint x=&quot;500&quot; y=&quot;130&quot; as=&quot;sourcePoint&quot; /&gt;&#10; &lt;mxPoint x=&quot;500&quot; y=&quot;560&quot; as=&quot;targetPoint&quot; /&gt;&#10; &lt;/mxGeometry&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;ll-authentik&quot; edge=&quot;1&quot; parent=&quot;1&quot; style=&quot;endArrow=none;dashed=1;html=1;strokeColor=#999999;&quot;&gt;&#10; &lt;mxGeometry relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10; &lt;mxPoint x=&quot;810&quot; y=&quot;130&quot; as=&quot;sourcePoint&quot; /&gt;&#10; &lt;mxPoint x=&quot;810&quot; y=&quot;560&quot; as=&quot;targetPoint&quot; /&gt;&#10; &lt;/mxGeometry&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;s1&quot; edge=&quot;1&quot; parent=&quot;1&quot; style=&quot;html=1;labelBackgroundColor=#1C1D1E;endArrow=block;strokeColor=#666666;fontColor=#666666;strokeWidth=2;fontSize=12;&quot; value=&quot;&amp;lt;span style=&amp;quot;background-color: light-dark(rgb(255, 255, 255), Line truncated

After

Width:  |  Height:  |  Size: 484 KiB

+2
View File
@@ -53,6 +53,8 @@ For an app using native OIDC, the login always follows the same path:
3. That exchange happens against Authentik's own address on the **service-to-service zone** — reachable from a browser for this one hop specifically, even though that zone doesn't get the mutual-TLS treatment the browser-facing zone does.
4. On success, the browser lands back on the app, still on the browser-facing zone.
![OIDC cross-zone redirect: the browser carries every hop itself — Authentik and the app never talk to each other directly — with only the OAuth authorize/token exchange ever crossing from the browser-facing zone into the service-to-service zone](../assets/sso-and-identity-oidc-cross-zone-redirect.svg)
So an app's OIDC discovery/authority setting always points at the service-to-service zone, even though the app itself is normally reached on the browser-facing zone — the two zones are defined in [`docs/dns-naming.md`](dns-naming.md). This is confirmed against one real app's actual login flow, not assumed to hold for every app without checking. Every other app-specific setting (token lifetime, scopes, flow type) doesn't generalize the same way — each app's own OIDC documentation gets read fresh rather than copying another app's provider config, since those details genuinely differ per vendor.
> [!NOTE]