| Crates.io | keyrunes-rust-sdk |
| lib.rs | keyrunes-rust-sdk |
| version | 0.1.0 |
| created_at | 2025-12-09 05:13:56.840506+00 |
| updated_at | 2026-01-05 05:25:43.318266+00 |
| description | Rust SDK for Keyrunes authentication and authorization service |
| homepage | |
| repository | https://github.com/Keyrunes/keyrunes-rust-sdk |
| max_upload_size | |
| id | 1974866 |
| size | 219,863 |
A Rust library for integrating with the Keyrunes authentication and authorization service.
Add to your Cargo.toml:
[dependencies]
keyrunes-rust-sdk = { version = "0.1.0", features = ["axum"] } # or "actix", "rocket", etc.
axum - Support for the Axum frameworkactix - Support for the Actix Web frameworkrocket - Support for the Rocket frameworkloco - Helper functions for the Loco frameworkYou can enable multiple features:
keyrunes-rust-sdk = { version = "0.1.0", features = ["axum", "actix"] }
use keyrunes_rust_sdk::KeyrunesClient;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create a new client instance
let client = KeyrunesClient::new("https://keyrunes.example.com")?;
// Perform login
let token = client.login("user@example.com", "password").await?;
println!("Token: {}", token.token);
// Get current user
let user = client.get_current_user().await?;
println!("User: {:?}", user);
// Verify groups
let groups = client.get_user_groups(None).await?;
println!("Groups: {:?}", groups);
Ok(())
}
If you need to access specific organization data in a multi-tenant environment, you can set the KEYRUNES_ORG_KEY environment variable. The client will automatically inject the X-Organization-Key header into requests.
export KEYRUNES_ORG_KEY=your-org-uuid
use axum::{
extract::State,
routing::get,
Router,
};
use keyrunes_rust_sdk::{
middleware::axum::{AuthenticatedUser, KeyrunesState},
KeyrunesClient,
};
#[tokio::main]
async fn main() {
let client = KeyrunesClient::new("https://keyrunes.example.com").unwrap();
let state = KeyrunesState::new(client);
let app = Router::new()
.route("/me", get(|user: AuthenticatedUser| async move {
format!("Hello, {}!", user.user.username)
}))
.with_state(state);
// ... start server
}
use actix_web::{get, web, App, HttpServer, Responder};
use keyrunes_rust_sdk::{
middleware::actix::{AuthenticatedUser, KeyrunesState},
KeyrunesClient,
};
#[actix_web::main]
async fn main() -> std::io::Result<()> {
let client = KeyrunesClient::new("https://keyrunes.example.com").unwrap();
let state = KeyrunesState::new(client);
HttpServer::new(move || {
App::new()
.app_data(web::Data::new(state.clone()))
.service(get_me)
})
.bind(("127.0.0.1", 8080))?
.run()
.await
}
#[get("/me")]
async fn get_me(user: AuthenticatedUser) -> impl Responder {
format!("Hello, {}!", user.user.username)
}
#[macro_use]
extern crate rocket;
use keyrunes_rust_sdk::{
middleware::rocket::{AuthenticatedUser, KeyrunesState},
KeyrunesClient,
};
#[launch]
fn rocket() -> _ {
let client = KeyrunesClient::new("https://keyrunes.example.com").unwrap();
let state = KeyrunesState::new(client);
rocket::build()
.manage(state)
.mount("/", routes![get_me])
}
#[get("/me")]
fn get_me(user: AuthenticatedUser) -> String {
format!("Hello, {}!", user.user.username)
}
use keyrunes_rust_sdk::{
middleware::loco::{
extract_token_from_headers,
get_user_from_token,
KeyrunesState,
require_admin,
},
KeyrunesClient,
};
async fn my_controller(
headers: &http::HeaderMap,
state: &KeyrunesState,
) -> Result<serde_json::Value, Box<dyn std::error::Error>> {
let token = extract_token_from_headers(headers)
.ok_or("Token missing")?;
let user = get_user_from_token(&state.client, &token).await?;
require_admin(&state.client, &user).await?;
Ok(serde_json::json!({"message": "Admin access granted"}))
}
login(email, password) - Performs login and returns tokenregister(username, email, password) - Registers new userregister_admin(username, email, password, admin_key) - Registers administratorset_token(token) - Sets token manuallyclear_token() - Clears the tokenget_current_user() - Gets current authenticated userget_user(user_id) - Gets user by IDhas_group(user_id, group_id) - Verifies if user belongs to groupget_user_groups(user_id) - Gets list of user groupsUser - User modelGroup - Group modelToken - Authentication token modelUserRegistration - User registration dataAdminRegistration - Administrator registration dataLoginCredentials - Login credentialsThe library uses custom error types:
KeyrunesError::AuthenticationError - Authentication errorKeyrunesError::AuthorizationError - Authorization errorKeyrunesError::UserNotFoundError - User not foundKeyrunesError::GroupNotFoundError - Group not foundKeyrunesError::NetworkError - Network errorKeyrunesError::HttpError - HTTP errorSee the examples/ folder for complete usage examples with each framework:
basic_usage.rs - Basic client usageaxum_example.rs - Axum integrationactix_example.rs - Actix Web integrationrocket_example.rs - Rocket integrationloco_example.rs - Loco integrationTo run an example:
cargo run --example basic_usage --features axum
MIT OR Apache-2.0
Contributions are welcome! Please:
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)Made with ❤️ for the Keyrunes community