Crates.io | prefixed-api-key |
lib.rs | prefixed-api-key |
version | 0.3.0 |
source | src |
created_at | 2022-08-28 22:12:44.59757 |
updated_at | 2024-08-21 00:54:03.574545 |
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