Skip to content

[1/n] Add id column on tokens and sessions #8137

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

Merged
merged 13 commits into from
Jun 3, 2025
Merged

Conversation

david-crespo
Copy link
Contributor

@david-crespo david-crespo commented May 12, 2025

Closes #8139. Token IDs are used in #8227 and #8231 for token CRUD.

WIP. Everything compiles and existing tests work, but we are not yet testing retrieval by ID and we need to think about authz checks on the datastore functions for retrieving tokens and sessions by token string.

This PR would be a lot shorter if not for the fact that the token column was the primary key on both tables, so adding the id requires a bunch of migration steps to change the primary key. There were also a lot of changes to code and tests around making things ID-centric instead of token-centric.

  • SQL migrations for adding id col and changing primary key to that
  • Add TypedUuid to session and token DB models
  • Update authz_resource! and lookup_resource! calls for new primary key
  • Update Session trait methods to use id instead of token
  • Update app and datastore session and token methods to use ID instead of token
  • Update two distinct but nearly identical FakeSession implementations (one for unit tests, one for integration tests) to a) track sessions in a Vec instead of a HashMap with token keys
  • Figure out authz situation in new fetch session/token by token string methods

@@ -957,7 +957,7 @@ authz_resource! {
authz_resource! {
name = "DeviceAccessToken",
parent = "Fleet",
primary_key = String, // token
primary_key = { uuid_kind = AccessTokenKind },
roles_allowed = false,
polar_snippet = FleetChild,
Copy link
Contributor Author

@david-crespo david-crespo May 13, 2025

Choose a reason for hiding this comment

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

I'm realizing FleetChild will probably have to change.

@david-crespo david-crespo marked this pull request as ready for review May 20, 2025 15:27
@david-crespo david-crespo changed the title Add id column on tokens and sessions [1/n] Add id column on tokens and sessions May 24, 2025
@hawkw hawkw self-requested a review June 2, 2025 17:27
Copy link
Member

@hawkw hawkw left a comment

Choose a reason for hiding this comment

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

Overall, this makes sense to me. I had some minor nitpicks and style suggestions.

@david-crespo
Copy link
Contributor Author

@hawkw I addressed all your feedback (I think) in f3bd37a

Copy link
Member

@hawkw hawkw left a comment

Choose a reason for hiding this comment

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

Lovely, thanks for addressing my suggestions!

@david-crespo david-crespo merged commit c0f8d23 into main Jun 3, 2025
16 checks passed
@david-crespo david-crespo deleted the token-session-ids branch June 3, 2025 16:04
david-crespo added a commit that referenced this pull request Jun 4, 2025
Closes #2302. Built on top of #8137, but doesn't really rely on much in
there. Implementing [RFD
570](https://rfd.shared.oxide.computer/rfd/0570).

- [x] Add `silo_settings` table with nullable device token expiration
(seconds) column. Null setting means no max
  - Also populate this table with null maxes for all existing silos
- [x] Follow behavior of quotas table: create silo settings entry on
silo create, delete it on silo delete
- [x] View and update settings endpoints at `/v1/settings` with all
necessary plumbing
- Following RFD 570, these are silo-scoped endpoints, only accessible to
users inside the silo, as opposed to, for example, fleet operators being
able to set it for any silo
- [x] Users don't set token expiration directly yet — at token create
time, if the current silo has its max set, the token gets an expiration
timestamp based on that max. Otherwise the token does not expire
- [x] Test that trying to set a negative or 0 TTL 400s
- [x] Fix authz tests and verify endpoint tests
- [x] Bikeshed endpoint paths, operation IDs, property names, etc
david-crespo added a commit that referenced this pull request Jun 4, 2025
Built on top of #8137 and #8214.

This is only for a user to list and delete their own tokens. It doesn't
quite match RFD 570, which says `/v1/device-tokens` instead of
`/v1/me/access-tokens`, but it feels good under `/v1/me`, and after
trying to make the UI too, I think "access tokens" is much more
intuitive. If I stick with this, I will update RFD 570 to match.

~~I'm not sure about the path `/v1/device-tokens` — in the API we call
them `Device Access Tokens`. I think `/v1/access-tokens` might be more
intuitive because the `device` is sort of an implementation detail, it
refers to the OAuth device auth flow, which we are using. In practice,
the user just gets a token with the CLI and pastes a code into the web
UI and they don't have to think too much about it, so exposing that
detail in the name might not be worth it.~~ Went with
`/v1/me/access-tokens`.

- [x] Basic token list and delete
- [x] Basic integration tests
- [x] Finalize endpoint paths
- [x] Figure out authz story
  - Went with restricting datastore functions to current actor for now
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.

Add ID columns to tokens and sessions
4 participants