Files
factorio-expcluster/exp_discord_auth
bbassieandClaude Opus 5.5 1c713ba0aa Address review of the Discord plugin
The plugin is now exp_discord_auth, so later Discord plugins can sit
next to it. Config keys, permissions, routes and the Lua module moved
with it, and the Discord redirect is now api/exp_discord_auth/callback.

The controller registers its handlers and routes in the constructor and
uses the express types, the instance plugin is a closure, and the Lua
commands file returns its commands. The get and unlink responses carry
the controller url so the in game messages can name the website.

The login form asks the new status route whether Discord is configured
and shows the error straight away instead of a button that fails. The
button is full width like the link button, and a "Not you?" link next
to the Discord name replaces the separate switch account button.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 13:38:20 +00:00
..
2026-10-14 13:38:20 +00:00
2026-10-14 13:38:20 +00:00
2026-10-14 13:38:20 +00:00
2026-10-14 13:38:20 +00:00

ExpGaming - Discord Auth

Lets players log in to the web interface with Discord, and links their Factorio accounts to a Discord account. It only uses the OAuth2 identify scope, so no bot is needed.

Setup

  1. Create an application in the Discord developer portal.
  2. Under OAuth2, copy the Client ID and reset the Client Secret to get one.
  3. Under OAuth2 → Redirects, add <controller.public_url>api/exp_discord_auth/callback. For a controller with controller.public_url set to https://example.com/cluster/ that is https://example.com/cluster/api/exp_discord_auth/callback. It must match exactly, including the trailing path and http or https.
  4. Set the config on the controller:
npx clusterioctl controller config set controller.public_url https://example.com/cluster/
npx clusterioctl controller config set exp_discord_auth.client_id <client id>
npx clusterioctl controller config set exp_discord_auth.client_secret <client secret>

controller.public_url has to be set, because the redirect URL is built from it and Discord rejects any URL that isn't registered.

Config

All fields are on the controller.

Field Default Description
exp_discord_auth.client_id Application ID of the Discord application.
exp_discord_auth.client_secret OAuth2 client secret of the Discord application. Only readable on the controller.
exp_discord_auth.max_accounts 3 How many Factorio accounts one Discord account can link.

Linking

There are two ways to link a Factorio account:

  • On the user page, a logged in user clicks Link Discord and approves it on Discord.
  • On the login page, a player logs in with Discord and gets a code, then types /link-discord CODE on any server. This is how a player who can't log in to the web interface yet links their account.

Linking a Factorio account that is already linked to another Discord account moves it. /link-discord without a code shows the current link, and /unlink-discord removes it. The user page has an Unlink button too.

Users can always see and remove their own link. The exp_discord_auth.link.get and exp_discord_auth.link.delete permissions allow it for other users.

Once linked, the Discord tab on the login page has a "Log in as" button for each linked account. Banned users can't log in this way.

Links are stored in database/exp_discord_auth/accounts.json on the controller.