-
Notifications
You must be signed in to change notification settings - Fork 269
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
Hash API keys #3842
base: feature/1027-reset-api-key
Are you sure you want to change the base?
Hash API keys #3842
Commits on Aug 5, 2024
-
Configuration menu - View commit details
-
Copy full SHA for fa12188 - Browse repository at this point
Copy the full SHA fa12188View commit details -
Configuration menu - View commit details
-
Copy full SHA for 01481fa - Browse repository at this point
Copy the full SHA 01481faView commit details -
Add new UI to reset and display API key
How API keys are reset and displayed has changed since the initial version of API keys: Users will be able to view an API key exactly once after it has been created/reset. This requires a slightly different user interface. We’re also planning a few more changes to API keys in the future, and these UI changes prepare for that.
Configuration menu - View commit details
-
Copy full SHA for 4d8b027 - Browse repository at this point
Copy the full SHA 4d8b027View commit details -
Refactor existing settings screen
The existing settings UI was a little cluttered and unstructured. We’re going to add new settings in this PR and in follow-up PRs, so I took the time to clean up the UI (both visually and implementation-wise).
Configuration menu - View commit details
-
Copy full SHA for 7097196 - Browse repository at this point
Copy the full SHA 7097196View commit details -
Ensure that toasts are always visible, even when scrolling
This is a hacky workaround, but a proper fix would require quite some refactoring. Considering that this hack is pretty isolated and not going to affect any other parts of the UI and that we will need to upgrade to Blueprint 5 at some point anyway, I’ve opted for the quick-and-dirty solution for now.
Configuration menu - View commit details
-
Copy full SHA for 64fd321 - Browse repository at this point
Copy the full SHA 64fd321View commit details -
Configuration menu - View commit details
-
Copy full SHA for 6a4268c - Browse repository at this point
Copy the full SHA 6a4268cView commit details -
Use session tokens for authentication in API tests
In the future, roles won’t have an API key by default anymore. As an alternative, we generate session tokens explicitly.
Configuration menu - View commit details
-
Copy full SHA for e743aaa - Browse repository at this point
Copy the full SHA e743aaaView commit details -
Do not generate API tokens for new roles
Most users do not need API access so there’s no reason to generate an API key for them by default.
Configuration menu - View commit details
-
Copy full SHA for f1821b6 - Browse repository at this point
Copy the full SHA f1821b6View commit details -
Handle users without an API key properly in the settings UI
Previously, an API was generate automatically for new users, i.e. every user had an API key. This has now changed, and the settings UI needs to properly handle situations where a user doesn’t yet have an API key. As this increases the complexity of the UI state, I’ve refactored the component to make use of a local reducer.
Configuration menu - View commit details
-
Copy full SHA for a59f346 - Browse repository at this point
Copy the full SHA a59f346View commit details -
Configuration menu - View commit details
-
Copy full SHA for f643993 - Browse repository at this point
Copy the full SHA f643993View commit details -
Rename "reset_api_key" to "generate_api_key"
This method is now also used to generate an initial key for users who do not yet have an API key.
Configuration menu - View commit details
-
Copy full SHA for 7fae093 - Browse repository at this point
Copy the full SHA 7fae093View commit details -
Configuration menu - View commit details
-
Copy full SHA for 9e643db - Browse repository at this point
Copy the full SHA 9e643dbView commit details -
Extract logic to regenerate API keys into separate module
While the logic initially was quite simply, there will be more business logic related to API keys, e.g. sending notifications ahead of and when an API key has expired.
Configuration menu - View commit details
-
Copy full SHA for 154f8cf - Browse repository at this point
Copy the full SHA 154f8cfView commit details -
Configuration menu - View commit details
-
Copy full SHA for 27ebe7b - Browse repository at this point
Copy the full SHA 27ebe7bView commit details -
Extract
generate_api_key
method from role modelInitially, I added this to the role model as the model to be consistent with the model's `set_password` method. However, as the logic to generate an API token has become more complex, it is clear that it shouldn't live in the model.
Configuration menu - View commit details
-
Copy full SHA for 758d939 - Browse repository at this point
Copy the full SHA 758d939View commit details -
Configuration menu - View commit details
-
Copy full SHA for 89b40f3 - Browse repository at this point
Copy the full SHA 89b40f3View commit details -
Configuration menu - View commit details
-
Copy full SHA for e701e80 - Browse repository at this point
Copy the full SHA e701e80View commit details -
Configuration menu - View commit details
-
Copy full SHA for df51af5 - Browse repository at this point
Copy the full SHA df51af5View commit details -
Configuration menu - View commit details
-
Copy full SHA for f57f678 - Browse repository at this point
Copy the full SHA f57f678View commit details -
Remove unnecessary keys from API JSON response
Aleph represents both users and groups using the role model. However, some API keys (such as `has_password` or `has_api_key` are not relevant for groups).
Configuration menu - View commit details
-
Copy full SHA for 3591e04 - Browse repository at this point
Copy the full SHA 3591e04View commit details -
Configuration menu - View commit details
-
Copy full SHA for 470e919 - Browse repository at this point
Copy the full SHA 470e919View commit details -
Configuration menu - View commit details
-
Copy full SHA for fd5a17e - Browse repository at this point
Copy the full SHA fd5a17eView commit details -
Aleph used to store user API keys as plaintext in the database. This commit changes that to store only a hash of the API key. API keys are generated using the built-in `secrets.token_urlsafe` method which returns a random 256 bit token. In contrast to passwords, API keys are not provided by users, have a high entropy, and need to be validated on every request. It seems to be generally accepted that, given 256 bit tokens, salting or using an expensive key derivation functions isn't necessary. For this reason, we’re storing an unsalted SHA-256 hash of the API key which also makes it easy to look up and verify a given API key. I've added a separate column for the hashed API key rather than reusing the existing column. This allows us to batch-hash all existing plaintext keys without having to differentiate between keys that have already been hashed and those that haven't. Once all existing plaintext API keys have been hashed, the old `api_key` column can simply be dropped.
Configuration menu - View commit details
-
Copy full SHA for 97252b1 - Browse repository at this point
Copy the full SHA 97252b1View commit details -
Configuration menu - View commit details
-
Copy full SHA for 15b52eb - Browse repository at this point
Copy the full SHA 15b52ebView commit details -
Remove prefilled API key from OpenRefine endpoints
Required as we do not store plaintext API keys anymore. Also, we want to remove the option to pass API keys via URL parameters in the future. This makes it impossible to use OpenRefine with non-public collections. This was never documented, and most users weren't aware that they can indeed use OpenRefine with non-public collections anyway.
Configuration menu - View commit details
-
Copy full SHA for 5f94f9b - Browse repository at this point
Copy the full SHA 5f94f9bView commit details