Skip to main content

Project Aria Login Troubleshooting

Login Failures​

"Invalid email address: ... Expected format <username>@tfbnw.net"​

Password login only accepts distributed accounts. You entered an email with @ but not ending in allowed domains.

Fix: Use bare username without domain, or full user@tfbnw.net, or user@*.wptst.com. For Work accounts, use full email — it will auto-detect MMA flow.

Code path: AuthenticationManager.get_email() in _internal/auth_manager.py.

"Login failed" with no details​

Run with verbose flag to see underlying exception:

projectaria_login -v login --username ...

Common causes in logs:

  • AuthenticationError: Getting public key failed — network issue reaching meta.graph.meta.com. Check VPN / proxy.
  • Login failed with response ... — wrong password, or account locked. Verify credentials in browser first.
  • Failed to initiate MMA device flow — cannot reach graph.work.meta.com. Ensure Work VPN or office network if required.

MMA flow times out​

CLI prints URL and code, then polls. If you don't complete browser SSO in time:

AuthenticationError: Device authorization timed out

Fix: Re-run login, complete browser flow within about 5 minutes (the device code expires then). Check that browser opens correct Work SSO page, not cached error page. Try incognito window.

Polling interval defaults to 5s; polling continues until you authorize or until the device code expires (about 5 minutes), after which polling stops and you must re-run login. These are not user-configurable via CLI; use Python API with custom loop if needed.

"Already logged in as ..." but token invalid in other tool​

Token validation is per-tool startup. If you changed password or admin revoked session server-side, each tool will detect on next API call and clear keyring.

Fix: Run projectaria_login logout then login again. This clears stale token everywhere.

Keyring Issues​

"Token could not be saved to keyring" warning​

Keyring backend not available or locked.

macOS: First use triggers Keychain permission popup — click Allow. If denied, open Keychain Access → right-click login keychain → Unlock, then retry.

Linux headless: Install and start gnome-keyring daemon:

sudo apt install gnome-keyring
eval $(gnome-keyring-daemon --start --components=secrets)
# test
python3 -c "import keyring; keyring.set_password('a','b','c'); print(keyring.get_password('a','b'))"

If still fails, check python3 -c "import keyring; print(keyring.get_keyring())" — should show SecretService, not fail or Null.

Windows: Should work out of box with Windows Credential Manager. If using WSL, WSL has no Windows credential passthrough by default — either run native Windows Python (to use Windows Credential Manager), or leave the keyring unavailable and set PROJECTARIA_TOKEN_KEY so the token is persisted to the encrypted-file fallback (see the "No keyring backend" section below). Do not install keyrings.alt's PlaintextKeyring, which stores the token unencrypted.

CI / Docker: The keyring is typically unavailable. Set PROJECTARIA_TOKEN_KEY (at least 12 characters) so the token is saved to and loaded from the encrypted file (~/.projectaria/auth_token.enc) with no prompt. Log in once interactively (or on a host with the same key), then reuse the encrypted file across runs. See Encrypted File Fallback Issues below.

"No keyring backend" in logs​

Python keyring package installed but no system backend found. Install the OS-specific backend package as above so the token is stored in the system keyring.

If no system keyring is available (headless servers, containers, CI/CD), do not install a plaintext keyring backend such as keyrings.alt's PlaintextKeyring. Doing so makes keyring report as "available" and writes the token in plaintext to ~/.local/share/python_keyring/keyring_pass.cfg, which also disables the safer automatic encrypted-file fallback. Instead, leave the system keyring unavailable and set PROJECTARIA_TOKEN_KEY (≥ 12 characters) so the token is persisted to the built-in encrypted-file fallback (AES-256-GCM):

export PROJECTARIA_TOKEN_KEY='your-strong-passphrase' # at least 12 characters

Encrypted File Fallback Issues​

When no keyring backend is available, projectaria_login stores the token in an encrypted file at ~/.projectaria/auth_token.enc. See Token Storage → Encrypted File Fallback for the full model.

"Token could not be saved" even though the keyring is down​

No usable key material was found. The PROJECTARIA_TOKEN_KEY env var and any entered passphrase must be at least 12 characters; shorter values are rejected and the token is not saved.

Fix: Set a strong PROJECTARIA_TOKEN_KEY (≥ 12 chars) before logging in, or enter a passphrase of at least 12 characters at the prompt.

verify/logout keeps prompting for a passphrase​

The file was saved with an interactive passphrase (key_source: passphrase), so it must be re-entered to decrypt. If you would rather avoid prompts, log in again with PROJECTARIA_TOKEN_KEY set so the file uses the env-var key source.

"Failed to decrypt the encrypted token file" and it disappears​

This message means decryption was actually attempted and failed, so the file is removed to avoid failing on every subsequent run. It applies in two cases: the file uses an env-var key (key_source: env) and PROJECTARIA_TOKEN_KEY is wrong or the data was tampered with — the key is present, so decryption runs immediately on load — or the file is structurally unusable regardless of the key (a malformed blob, an unsupported format version or KDF, an out-of-range iteration count, or content that decrypts cleanly but is not a valid Aria token).

A wrong interactive passphrase is handled differently and does not remove the file: it is treated as recoverable (up to 3 attempts, and the file is kept even if you decline or exhaust them), so a single typo never deletes a still-valid token. A file that needs PROJECTARIA_TOKEN_KEY while the variable is unset is likewise kept, because decryption is never attempted.

Fix: Use the same key material as at login. For an env-var file, set the correct PROJECTARIA_TOKEN_KEY (and, if the file was already removed, run projectaria_login login --username ... again). For a passphrase-protected file, re-run and enter the full passphrase (a too-short passphrase at the decrypt prompt is re-prompted rather than attempted).

Logout says the server-side session was not invalidated​

Server-side logout needs a usable token. If the encrypted file cannot be decrypted (or no passphrase is provided), logout clears local state or keeps the file but skips the server call.

Fix: Re-run projectaria_login logout providing the correct passphrase (or with PROJECTARIA_TOKEN_KEY set). To force-remove the local file without a server-side logout, delete ~/.projectaria/auth_token.enc.

Network and Proxy​

All endpoints use HTTPS:

  • Password flow: meta.graph.meta.com, meta.graph.meta.com/graphql
  • MMA flow: graph.work.meta.com, api2.work.meta.com
  • Token validation: GraphQL endpoint via RequestHelper
  • Logout: graph.oculus.com/logout

If behind corporate proxy, set standard env vars — aiohttp respects HTTP_PROXY, HTTPS_PROXY, NO_PROXY.

Test connectivity:

curl -v 'https://meta.graph.meta.com/passwords_encryption?version=2' -H "Authorization: Bearer FRL|..."
# expect 401 or 400 without valid token, not timeout

Legacy Migration Issues​

Migration of the pre-2024 unencrypted ~/.projectaria/auth_token file is no longer supported. If such a file exists, it is neither read nor migrated.

Fix: Delete it manually and log in again: rm ~/.projectaria/auth_token && projectaria_login login --username ...

Getting Help​