Store a per-profile API URL for multi-environment auth
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 45/100
- Issue type
- Feature
- Clarity
- Needs clarification
- Activity status
- Quiet
- Tech stack
- rust
- Domain
- api, authentication, cli
Research direction
Start with the TokenStore schema and migration paths, then trace read_token, Authentication::new, fetch_profile_info, and fetch_profiles_with_info. Resolve the open URL-capture decision before implementing. Done means profile URLs round-trip, legacy profiles fall back to the global default, and auth list uses each profile's host in tests.
Written by the indexing model from the issue text.
Description
Background
The multi-profile auth work in #293 stores only a token per profile, and every command resolves the API host from the single API_BASE_URL (defaulting to prod). Since multi-profile usually means multi-environment (for example a prod profile and a stage profile), this means:
auth listsends every stored token to the one host, so a stage token gets transmitted to the prod host and then shows blank because it 401s.- There is no way to keep a profile pinned to the environment its token belongs to.
Raised by @sergey-borovkov in review: it is much cheaper to decide the storage format now, while it is new, than to migrate it a second time later.
Proposal
Store an optional API URL per profile and use it wherever a profile's token is used (read_token/Authentication::new, fetch_profile_info, fetch_profiles_with_info). Profiles without a URL (including migrated legacy ones) fall back to the current global default, so this stays backward compatible.
Open decision — how is the URL captured?
This is the reason it was deferred from #293 rather than guessed at. Options:
screenly login --url <url>— explicit, but one more flag to pass.- Capture the resolved
API_BASE_URL(env or default) at login time and store it — zero new flags, but implicit and easy to get wrong if the env var isn't set. - Both:
--urloverrides, otherwise capture the resolved base URL.
Option 3 is probably the most forgiving. Worth agreeing on before implementing.
Scope / touch points
TokenStoreschema: each entry becomes token + optional url (migration-safe, since serdeOptiondefaults toNone).- Migration: legacy plain-text and existing single-token stores get
url: None→ global default. read_token/Authentication::new: resolve the active profile's url alongside its token.fetch_profile_info/fetch_profiles_with_info: use the per-profile url.- Tests: per-profile url round-trips, fallback to default when absent,
auth listhits each profile's own host.
Notes
- Not a blocker for #293; that PR intentionally leaves this out.
- Backward compatible if the url field is optional with a default.
- Dominant language
- Rust
- Stars
- 29
- Forks
- 7
- Avg merge
- 1d 20h
- Merged PRs (30d)
- 12
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from Screenly/cli
-
Difficulty 3/5 1-2 days Newbie friendliness 48/100
-
Difficulty 3/5 1-2 days Newbie friendliness 42/100
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 55/100
-
enhancement
Difficulty 3/5 1-2 days Newbie friendliness 45/100
Similar issues
-
risk:low runtime status:in-progress type:test
Difficulty 1/5 Under an hour Newbie friendliness 92/100
zeroclaw-labs/zeroclaw#11023 ·
-
good first issue refactor
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
EricSpencer00/Resilient#4835 · 1 comment ·
-
agent:ready documentation
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
cesarferreira/stax#890 ·
-
bug
Difficulty 1/5 Under an hour Newbie friendliness 90/100