feat(auth): sign in with Steam (MODULE_API 1.17.0) #218
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/steam-signin"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What & why
Sign in with Steam as a built-in provider beside Google and Discord (
docs/website/STEAM_SIGNIN.md, decisions D392–D396, docs#363). Closes #214. Goes onedgefor the cutover in progress. Before branching I fast-forwardededgetomain(6ba2ed9); it had nothing of its own.auth/providers/steam.provider.js):checkid_setupredirect with ourstateinsidereturn_to. The callback checksop_endpoint, an exactreturn_to(so a captured assertion can't be replayed into another flow), a 17-digit claimed id, identity = claimed id, and then the server-to-servercheck_authentication. That check is never skipped, and a transport failure refuses the sign-in.client_secret_enc, write-only). Admin → Auth refuses to enable Steam without one. The persona name and avatar (Steam CDN only) are stored on the identity and refreshed at each sign-in. A failed lookup never blocks a sign-in.player_registrationsays.DELETE /auth/me/account/identities/:provider?id=unlinks one identity; without?id=it behaves as before.ctx.identities.list(userId, provider), plusapi.onIdentityLinking(refuse-only, fails closed, 5 s; a module's text is logged and never put in the redirect, onlylink_error=in_use|refused) andapi.onIdentityLinked(bounded; a failure never undoes the link). There is no unlink hook (D393).auth_providers.kindgainssteam;user_identitiesgainsdisplay_nameandavatar_url.routes.manifest.json/routes.guards.jsonandengagement-triggers.jsonregenerated. Generate them withMODULES_DIRpointing at an empty directory: a localmodules/leaks module routes into core's manifests.Docs: docs
docs/steam-signin-build(STEAM_SIGNIN.md§8,MODULE_API.md1.17.0,BACKEND_DESIGN.md§3/§4/§6). Companions: Module-Rustfeat/steam-signin-linkand Android-appfeat/steam-signin, both intoedge.How it was tested
npm test(server,MODULES_DIRempty): 2,161 pass, 0 fail. That includes the newtest/steamSignin.test.js(32 tests): §3's checks, a replayed assertion,is_valid:false, Steam unreachable, a failed Web API lookup, a non-CDN avatar, enabling with no key, no provisioning on web and mobile, a mobile sign-in, cancel, a module refusal writing nothing, fail-closed, a linked hook failing, multi-account unlink.npm run buildplus 430 tests pass.steamwalk, a copy ofrustwalk, with Module-Rust from its branch):finishLink: a free id becomes a Rust link; another account's Rust link is refused with nothing written; a second Steam account links; an id linked elsewhere is refused by core.routeManifest.test.jsfails on this machine with the localmodules/installed onmaintoo. It passes withMODULES_DIRempty, which is what CI sees.Checklist
AI-assisted contributions (required)
Claude Code (Claude Opus 5.5). I have reviewed and understandevery change, and take responsibility for it. AI-authored commits are
marked with a
Co-Authored-By/Assisted-Bytrailer.License
(GNU GPL v3.0 or later), and I have the right to contribute it.
🤖 Generated with Claude Code
https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY