18个版本 (9个破坏性版本)
0.11.1 | 2024年2月6日 |
---|---|
0.10.1 | 2024年1月10日 |
0.10.0 | 2023年11月26日 |
#185 in 身份验证
每月100次下载
46KB
1K SLoC
Brize Auth
一个微小的异步身份验证库。
摘要
一个简化Rust生态系统身份验证的工具。有意构建以与您的特定业务/模式逻辑无关。主要控制用户的 凭证,并可选项地管理 会话。使用Tokio运行时异步构建,并支持MySql和SurrealDB。
凭证
Brize auth 凭证有三个字段,一个 id 用于链接到您的特定业务/模式逻辑,一个 user_identity,它应该是一个识别用户的方式,例如电子邮件,以及一个 hashed_password。这将存储在数据库中的 user_credentials 表中。
会话
会话是可选的,如果您想使用其他会话解决方案。如果您启用 会话,Brize auth提供经典的表会话,其中 id 字段作为令牌,created_at 和 expired_at 用于管理过期。会话将存储在数据库中的 user_sessions 表中。还有一个可用于表单验证的 CSRF 令牌,作为 csrf_token。
设置
首先安装软件包
cargo add brize_auth --features "mysql,sessions"
然后,使用此模式设置数据库表,如果使用SQL数据库
-- Credentials table
CREATE TABLE user_credentials (
credentials_id CHAR(36) PRIMARY KEY,
user_name VARCHAR(255) NOT NULL,
hashed_password VARCHAR(255) NOT NULL
);
-- Sessions table
CREATE TABLE user_sessions (
session_id CHAR(36) PRIMARY KEY,
created_at BIGINT UNSIGNED NOT NULL,
expires_at BIGINT UNSIGNED NOT NULL,
user_id VARCHAR(255) NOT NULL,
csrf_token CHAR(44) NOT NULL
);
用法
MySql功能
use anyhow::{Context, Result};
use brize_auth::{
config::DatabaseConfig,
mysql::MySqlGateway,
AuthClient,
SessionClient
};
#[tokio::main]
fn main {
// Set your database params
let db_config = DatabaseConfig {
password: env::var("DB_PASSWORD").expect("DB_PASSWORD not found"),
user_name: env::var("DB_USER").expect("DB_USER not found"),
host: env::var("DB_HOST").expect("DB_HOST not found"),
port: env::var("DB_PORT").ok(),
db_name: env::var("DB_NAME").expect("DB_NAME not found"),
namespace: None,
}
// Start auth client
let auth: AuthClient<MySqlGateway> = AuthClient::new_mysql_client(&db_config).await;
// Get user credentials from a request
let user_name = "test@gmail.com";
let raw_password = "plokij1234!";
// Create a new set of credentials..
// .. returns the id of the credentials row, use this as some kind of reference key on YOUR user table
let credentials_id: String = auth.register(user_identity, raw_password).await.unwrap();
// Verify user credentials
let is_valid_user = auth.verify_credentials(user_name, raw_password).await.unwrap();
// Start session client
let session_client: SessionClient<MySqlGateway> = SessionClient::new_mysql_client(&db_config).await;
// Begin user session and configure expiration
let session: Session = session_client.start_session(user_id, Expiry::Month(1)).await.unwrap();
// Match csrf token
let csrf_from_form = "saslfj00324-2lkjsdf-sdfksfkajlasjfngj"
let is_valid_csrf: bool = session.match_csrf_toke(csrf_from_form);
// End session for user
session_client.destroy_session(&session.session_id).await.unwrap();
}
配置
可以配置首选数据库和会话过期时间
use brize_auth::{DatabaseConfig, Expiry};
pub struct DatabaseConfig {
pub db_name: String, // Name of database
pub password: String, // Password for user
pub user_name: String, // Name of user
pub host: String, // Host IP
pub port: Option<String>, // Port for host
pub namespace: Option<String> // Optional namespace in db
}
enum Expiry {
Second(u64), // Epoch seconds
Day(u64), // Days in EPOCH
Week(u64), // Weeks in EPOCH
Month(u64), // Months in EPOCH
Year(u64), // Years in EPOCH
}
支持的数据库
- MySql(凭证 + 会话)
- SurrealDB(凭证 + 会话)
路线图
原型阶段
- 用户注册
- 如果不存在,则创建用户凭证
- 如果存在用户凭证,则拒绝
- 返回凭证外键
- 登录
- 匹配用户凭证
- 如果匹配(如果启用会话),则返回会话令牌
- 如果没有匹配,则拒绝用户
- 哈希密码
- 会话管理
- 创建会话
- 验证会话
- 根据年龄和注销删除会话
- 注销
- 删除用户会话
- 更改凭证
- 更新user_identity
- 更新user_password
- 删除用户
- 从数据库中删除凭证和会话
alpha测试阶段
- 代码重构
- 领域模块
- 应用程序模块
- 基础设施模块
- 库
- 现场测试
- 安全生产数据库测试
- 基准测试
- 代码审查
beta特性
- 添加功能拆分
- 添加配置端口
- 为凭证和会话配置自定义表名
- 为会话和Csrf令牌添加刷新配置
依赖项
~2–21MB
~323K SLoC