Skip to content

feat: rework login authentication and add API token support #3999

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 45 commits into
base: master
Choose a base branch
from

Conversation

Nonary
Copy link

@Nonary Nonary commented Jun 22, 2025

Description

Adds token-based authentication to Sunshine’s API and admin UI.
Adds token based sessions as an alternative to basic authentication.
Admins can now create, view, and revoke login-free API tokens that grant only the routes they choose.
The existing Basic-Auth flow is untouched, this adds on top of the existing code; therefore there is no breaking changes.

Why this is secure

Measure What it means
Hash-only storage Raw token is shown once, then discarded; only its SHA-256 hash is stored, so a leaked state file reveals nothing usable.
Least-privilege scopes Each token carries an allow-list of API routes + verbs; any request outside that list is rejected.
One-click revocation Tokens can be invalidated instantly from the new API Tokens page or via the API.
Non-breaking Token logic is additive; Basic-Auth requests are processed exactly as before.

Benefits

  • Safe automation & integrations – third-party scripts and apps can call the Sunshine API without embedding the admin’s full credentials.
  • Minimal blast-radius – each token can be limited to just the endpoints it needs (e.g., /api/apps GET only), reducing risk, where as using basic auth would give full access to everything in Sunshine.
  • ** Password manager support ** - Browsers can now safely autofill the login.

Screenshot

image

Issues Fixed or Closed

None – this is a new capability.

Type of Change

  • Bug fix
  • New feature
  • Breaking change
  • Dependency update
  • Documentation update
  • Repository update

Checklist

  • Code follows project style guidelines
  • Self-review completed
  • Security-critical sections are commented
  • Docs and inline docstrings updated

@Nonary Nonary marked this pull request as draft June 23, 2025 01:22
@Nonary Nonary marked this pull request as ready for review June 23, 2025 04:34
@Nonary Nonary marked this pull request as draft June 23, 2025 05:42
@Nonary Nonary marked this pull request as ready for review June 23, 2025 05:52
@Nonary
Copy link
Author

Nonary commented Jun 23, 2025

There appears to be a weird bug in current master branch where there is like a ghost session showing in Moonlight. Thought this may have caused it but it does not.

@Nonary
Copy link
Author

Nonary commented Jun 23, 2025

There appears to be a weird bug in current master branch where there is like a ghost session showing in Moonlight. Thought this may have caused it but it does not.

Nevermind, only happens when you add a blank app to Sunshine... still a weird bug though

@Nonary Nonary marked this pull request as draft June 24, 2025 08:14
@Nonary Nonary changed the title feat: add token based authentication for API calls feat: rework login authentication and add API token support Jun 25, 2025
@Nonary Nonary marked this pull request as draft June 25, 2025 07:50
@Nonary
Copy link
Author

Nonary commented Jun 25, 2025

Flipping back to draft as I do extensive testing against the login screen and session handling.

Right now, the session handling and redirect is a prototype and has not been security reviewed by me yet.

@Nonary
Copy link
Author

Nonary commented Jun 26, 2025

Okay, it should be secure enough now. Next steps is to polish the code and remove any dead code, pointless comments and bugfixes if applicable.

Copy link
Member

@ReenigneArcher ReenigneArcher left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like the idea of adding tests to the web-ui part, but I think that should be done as a separate PR and before this one. It might be better to do after #3855 (or part of) as well.

Also, using common strategies to the following where possible (to ease the maintenance burden).

We'll also need to upload coverage to codecov for the web-ui. We already have upload coverage steps, but we'll need to include the reports from this part. There are examples in all 3 of the above.

@Nonary
Copy link
Author

Nonary commented Jun 26, 2025

I like the idea of adding tests to the web-ui part, but I think that should be done as a separate PR and before this one. It might be better to do after #3855 (or part of) as well.

Also, using common strategies to the following where possible (to ease the maintenance burden).

We'll also need to upload coverage to codecov for the web-ui. We already have upload coverage steps, but we'll need to include the reports from this part. There are examples in all 3 of the above.

Fine with me, it was mostly there to help me confirm everything is working without having me to constantly recompile sunshine and test by hand.

It is also kind of hacked in, I had to configure jest instead of using vite testing framework because our Vue setup is kinda chaotic. I am way more experienced in jest so went with that.

But probably would focus more on trying to figure out getting the built in testing framework for vite working instead on the separate PR.

@Nonary Nonary marked this pull request as ready for review June 26, 2025 19:53
@Nonary
Copy link
Author

Nonary commented Jun 26, 2025

I removed the frontend unit tests, did another sweep through in cleanup some dead code and comments. I've run through a lot of manual testing and automated testing, so I believe it is ready.

Copy link

Quality Gate Failed Quality Gate failed

Failed conditions
8 New issues
1 Security Hotspot
4.9% Duplication on New Code (required ≤ 2%)
8 New Code Smells (required ≤ 0)
18 Duplicated Blocks on New Code (required ≤ 0)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants