Identify the bot's web callers by Discord id, and isolate the bot's network
authentik/vanguard-profile-scope-mapping.py (new, and the first time that mapping is version-controlled rather than pasted from the docs) emits the Discord snowflake from the account's source connection alongside the inherited groups, so the bot never has to match a name. docker-compose.yml: discord-bot moves to its own network. It trusts the identity headers Caddy injects, and it shared the default bridge with jellyfin, copyparty, syncthing, gitea, act_runner and cadvisor, any of which could reach :8000 directly and forge them. It needs no sibling container: Caddy uses the published loopback port and MariaDB is reached through host.docker.internal. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -294,6 +294,14 @@ that stamped today's date is undone; latest activity and current rank/presence w
|
||||
is idempotent, and refuses rather than guessing if a column has no rule or a table is missing from the
|
||||
destination. Run it with the gateway stopped, report first, then `--apply`.
|
||||
|
||||
**Identity, exactly:** the bot gets the caller's Discord snowflake from the `discord_id` claim the proxy puts in
|
||||
`X-Authentik-Jwt`, emitted by the scope mapping in `authentik/vanguard-profile-scope-mapping.py` (the same mapping
|
||||
that carries inherited groups). Authentik already stores that id on the account's source connection, so nothing
|
||||
has to be matched by name. Without the claim the bot falls back to matching the Discord **username** only, never a
|
||||
server nickname: nicknames are self-chosen and not unique, so matching one would let a member be mistaken for
|
||||
another or make another ambiguous. `discord-bot` also runs on **its own Docker network** (`botnet`), because it
|
||||
trusts the headers Caddy injects and nothing else should be able to reach `:8000` to forge them.
|
||||
|
||||
The bot serves **both** its API and its web pages on 127.0.0.1:8000, published as `https://bot.HOST/` behind
|
||||
**Authentik forward-auth**: Caddy asks Authentik, then injects `X-Authentik-Username/-Groups/-Email`, and the
|
||||
bot authorises per request from those headers (`WEB_ALLOWED_GROUPS=bot-users,admins`; `WEB_SERVE_UI=true`
|
||||
|
||||
Reference in New Issue
Block a user