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:
POST /api/auth/device/code→device_code,user_code,verification_uri- poll
POST /api/auth/device/token→ session token on approval POST /api/auth/api-key/createwith that session → the rawrcr_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_downadds 5s and keeps going — it is not a failure.authorization_pendingkeeps going.access_denied/expired_tokenstop 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file recreator_auth-0.1.2.tar.gz.
File metadata
- Download URL: recreator_auth-0.1.2.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cafd3b34c59c76b0e68d0342d2a738bea933b4c3bfa24d990305575f730a11fc
|
|
| MD5 |
3917c645a3bfede0736e7d5bd5c19481
|
|
| BLAKE2b-256 |
c5595c06fb205ebdf38d321c798bd2df60e5410adf5c7b78500df8abafe14d8c
|
File details
Details for the file recreator_auth-0.1.2-py3-none-any.whl.
File metadata
- Download URL: recreator_auth-0.1.2-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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b6fc71ba8110cdf7a12be1cf976b254c0a5a9384bbedb8250e3a412d57788dfa
|
|
| MD5 |
a5553bf6eac80a9408afd6f10742c315
|
|
| BLAKE2b-256 |
cf0fe084158eef554502a867043acdceb1fff8fc2ed018bb021a7026e042112f
|