Skip to content

[3/n] /v1/me/access-tokens list and delete #8227

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 7 commits into from
Jun 4, 2025
Merged

Conversation

david-crespo
Copy link
Contributor

@david-crespo david-crespo commented May 27, 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.

  • Basic token list and delete
  • Basic integration tests
  • Finalize endpoint paths
  • Figure out authz story
    • Went with restricting datastore functions to current actor for now

}

Ok(())
}
Copy link
Contributor Author

@david-crespo david-crespo May 27, 2025

Choose a reason for hiding this comment

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

This is a hard delete — might want to put that in the name, since it's unusual. We do that in the session delete method. If we wanted a soft delete, we could set time_expires to now instead. That feels kind of bad to me, but so does hard delete.

Copy link
Member

Choose a reason for hiding this comment

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

I think the hard delete is fine, setting time_expires feels kind of worse especially with regards to errors when that token is used. Adding hard_delete to the name is fine with me, if you think that's important.

// typical authz check, instead effectively encoding the policy here that
// any user is allowed to list and delete their own tokens. When we add the
// ability for silo admins to list and delete tokens from any user, we will
// have to model these permissions properly in the polar policy.
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This is important. We hack around the harder authz problem of modeling token properly by restricting these functions to the current actor (for now).

@david-crespo david-crespo changed the title [3/n] /v1/me/tokens list and delete [3/n] /v1/me/device-tokens list and delete May 29, 2025
@david-crespo david-crespo marked this pull request as ready for review May 29, 2025 22:34
@david-crespo david-crespo force-pushed the device-tokens-api branch 2 times, most recently from f18022c to 6811931 Compare May 30, 2025 15:48
@david-crespo david-crespo force-pushed the silo-token-settings branch from f68b227 to 3c36e26 Compare May 30, 2025 16:56
@david-crespo david-crespo force-pushed the silo-token-settings branch from 3c36e26 to 26d25ab Compare May 31, 2025 00:00
@david-crespo david-crespo force-pushed the device-tokens-api branch 3 times, most recently from 66254ea to 9e014d0 Compare June 2, 2025 21:34
@david-crespo david-crespo force-pushed the silo-token-settings branch 2 times, most recently from d2fc15e to 14c544c Compare June 3, 2025 00:01
@david-crespo david-crespo changed the title [3/n] /v1/me/device-tokens list and delete [3/n] /v1/me/access-tokens list and delete Jun 3, 2025
david-crespo added a commit that referenced this pull request Jun 3, 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.

* [x] SQL migrations for adding `id` col and changing primary key to
that
* [x] Add `TypedUuid` to session and token DB models
* [x] Update `authz_resource!` and `lookup_resource!` calls for new
primary key
* [x] Update `Session` trait methods to use `id` instead of `token`
* [x] Update app and datastore session and token methods to use ID
instead of token
* [x] 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
* [x] Figure out authz situation in new fetch session/token by token
string methods
@david-crespo david-crespo requested a review from hawkw June 3, 2025 17:11
@david-crespo david-crespo force-pushed the silo-token-settings branch from 14c544c to 4dd9321 Compare June 3, 2025 17:19
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.

this one is pretty straightforwards, no big concerns from me!

Comment on lines +292 to +293
current_user_access_token_delete DELETE /v1/me/access-tokens/{token_id}
current_user_access_token_list GET /v1/me/access-tokens
Copy link
Member

Choose a reason for hiding this comment

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

I think I'm in favor of putting this under /v1/me, personally!

}

Ok(())
}
Copy link
Member

Choose a reason for hiding this comment

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

I think the hard delete is fine, setting time_expires feels kind of worse especially with regards to errors when that token is used. Adding hard_delete to the name is fine with me, if you think that's important.

Base automatically changed from silo-token-settings to main June 4, 2025 01:34
@david-crespo david-crespo enabled auto-merge (squash) June 4, 2025 01:38
@david-crespo david-crespo merged commit a8aeac6 into main Jun 4, 2025
17 checks passed
@david-crespo david-crespo deleted the device-tokens-api branch June 4, 2025 04:52
david-crespo added a commit that referenced this pull request Jun 4, 2025
Closes #8147.

Built on #8137, #8214, and #8227.

This is pretty straightforward, I think. The user gives us a TTL in
seconds at token request time. We store it on the request row. When they
come back in the later step to confirm the code and generate the token,
we retrieve the TTL, validate that it is less than the silo max (if one
is set), and we use it to generate the `time_expires` timestamp, which
cannot be changed later.

One slightly surprising bit is that we can't validate the TTL against
the silo max at initial request time because we don't have any idea what
silo the user is associated with until the confirm step. So probably
want to make sure we are handling TTL validation errors nicely in the
web console, because I think that's where they will show up.
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