| Crates.io | prefixed-api-key |
| lib.rs | prefixed-api-key |
| version | 0.3.0 |
| created_at | 2022-08-28 22:12:44.59757+00 |
| updated_at | 2024-08-21 00:54:03.574545+00 |
| description | A Rust module for generating a Prefixed API Key |
| homepage | https://github.com/brahmlower/prefixed-api-key |
| repository | https://github.com/brahmlower/prefixed-api-key |
| max_upload_size | |
| id | 654077 |
| size | 49,112 |
This library is a Rust implementation of the Prefixed API Key typescript library. Though its interface differs slightly from the typescript version, this library provides the same set of features and functionality as the typescript version.
Example key:
mycompany_BRTRKFsL_51FwqftsmMDHHbJAMEXXHCgG
Seam-style API Keys have many advantages:
Seam-style api keys look like this:
mycompany_BRTRKFsL_51FwqftsmMDHHbJAMEXXHCgG
Let's break down each component of the API key...
mycompany ..._... BRTRKFsL ..._... 51FwqftsmMDHHbJAMEXXHCgG
^ ^ ^
Prefix Short Token Long Token
short_token and hash(long_token).The original Typescript implementation of Prefixed API Keys has a few technical decisions hardcoded, but this crates aims to give full control over which hashing algorithm and random number generator are used. However this adds more complexity than may be desirable, so helpers are available to make configuration relatively painless.
By installing the crate with the sha2 feature flag, you can create an almost-entirely configured
PrefixedApiKeyController instance using the seam_defaults function, which configures the
controller the same way as Seam's Typescript implementation.
use prefixed_api_key::PrefixedApiKeyController;
fn main() {
// A controller using `rand::rng::OsRng` as the RNG source, and
// `sha2::Sha256` as the hashing algorithm.
let builder_result = PrefixedApiKeyController::configure()
.prefix("mycompany".to_owned())
.seam_defaults()
.finalize();
assert!(builder_result.is_ok());
let controller = builder_result.unwrap();
// Generate a new PrefixedApiKey
let (pak, hash) = controller.try_generate_key_and_hash().unwrap();
// Assert that the returned key matches the hash
assert!(controller.check_hash(&pak, &hash));
// Stringify the key to be sent to the user. This creates a string from the
// PrefixedApiKey which follows the `<prefix>_<short token>_<long token>` convention
let pak_string = pak.to_string();
}
Using the seam_defaults() function with the sha2 feature flag is equivalent to doing
the following without using the sha2 feature:
use sha2::Sha256;
use prefixed_api_key::PrefixedApiKeyController;
fn main() {
let controller = PrefixedApiKeyController::<_, Sha256>::configure()
.prefix("mycompany".to_owned())
.rng_osrng()
.short_token_length(8)
.long_token_length(24)
.finalize();
}
Library tests:
cargo test --all-features
Verify minimum supported rust version (MSRV):
cargo install cargo-msrv
cargo msrv verify
Testing code hygiene requires clippy and rustfmt components:
cargo fmt --all -- --check
cargo clippy -- -D warnings
The library and hygiene tests will be run for all examples too