Skip to main content

packages/auth — recreator auth

Device-flow sign-in for the CLI, and the one file that holds the MCP token.

recreator auth login → device code → browser: email + OTP → approve → rcr_ token at ~/.recreator/token

Why the device flow

OAuth 2.0 Device Authorization Grant (RFC 8628), the same model as gh auth login. Chosen over a localhost-callback server because it needs no free port and no reachable loopback — so it works over SSH and inside a container, which is where an agent toolkit actually runs.

The two hops

/device/token returns a Better Auth session token, not an API key. Sessions expire and are cookie-cache bound; the MCP server authenticates with an @better-auth/api-key value. So login is two requests:

  1. POST /api/auth/device/codedevice_code, user_code, verification_uri
  2. poll POST /api/auth/device/token → session token on approval
  3. POST /api/auth/api-key/create with that session → the raw rcr_ key, returned exactly once (the server stores only a SHA-256 digest)

Only the rcr_ key is written to disk. The session token is discarded.

Polling rules that are not optional

Encoded in poll_for_token, and the reason that function takes an injectable sleep and monotonic:

  • Honour the server's interval (5s as configured).
  • slow_down adds 5s and keeps going — it is not a failure.
  • authorization_pending keeps going.
  • access_denied / expired_token stop with an actionable message.
  • Stop at expires_in. The deadline is checked before sleeping, so the loop never spends an interval to learn what it already knows.

The token file

~/.recreator/token, mode 0600, in a 0700 directory, created with the final mode rather than chmod-ed afterwards — an umask-widened file would be world-readable for the window in between.

Login refuses to overwrite an existing token without --force, matching the project's convention for destructive acts.

~/.recreator/ is shared with unrelated secrets (registry-token, env.sh, resend-api-key). This package reads and writes the token entry and nothing else. RECREATOR_TOKEN_FILE overrides the path, which is how tests stay off a real credential.

Client identity

client_id is recreator-cli, which must appear in the portal's DEVICE_CLIENT_IDS allowlist (apps/web/src/lib/auth.ts). The allowlist is load-bearing: without it the plugin accepts any client_id, and a device code could be minted under an attacker-chosen identity.

Layout

storage.py   the token file: permissions, overwrite refusal, masking
device.py    RFC 8628 protocol + the polling state machine. No I/O beyond HTTP.
session.py   session → rcr_ key exchange, and identity lookup for `status`
login.py     order of operations, printed output, exit codes

device.py talks to a Transport protocol, so the state machine is tested with a scripted transport and a fake clock — no network, no real sleeping.

Commands

recreator auth login                 # device flow, opens a browser
recreator auth login --no-browser    # print the URL instead (SSH, containers)
recreator auth login --force         # replace an existing token
recreator auth status                # masked token + portal validation
recreator auth status --offline      # skip the portal round trip
recreator auth logout                # delete the token

--base-url points any of these at a preview deployment instead of production.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

recreator_auth-0.1.3.tar.gz (13.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

recreator_auth-0.1.3-py3-none-any.whl (13.1 kB view details)

Uploaded Python 3

File details

Details for the file recreator_auth-0.1.3.tar.gz.

File metadata

  • Download URL: recreator_auth-0.1.3.tar.gz
  • Upload date:
  • Size: 13.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for recreator_auth-0.1.3.tar.gz
Algorithm Hash digest
SHA256 a763b3a0fff174d67d4f74d371de1a7cea2dfe8fc1a15f7fff8aa290c4d97937
MD5 7284dbd9b72ed1dc3152433feebeeb95
BLAKE2b-256 8317262cd071a63ab369e356ec6723c0eb1a7a13be19f739293187ab3ef8b2dd

See more details on using hashes here.

File details

Details for the file recreator_auth-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: recreator_auth-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 13.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for recreator_auth-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 781b5e43702fc98b393605ab9af6fdda71a8451f7d423dc04ab87ba65ec4c536
MD5 e58c293816a85f47b9455dda835c7843
BLAKE2b-256 4227e0dbe1e1e16bb2e81cf0b4fbb7811f9dd3a8fa28487639b760f92df122c5

See more details on using hashes here.

Release history Release notifications | RSS feed

0.1.4

2 files

This release

0.1.3 This release

2 files

0.1.2

2 files

0.1.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page