#user #web #surrealdb #credentials #session #mysql

brize_auth

一个微小的异步身份验证库

18个版本 (9个破坏性版本)

0.11.1 2024年2月6日
0.10.1 2024年1月10日
0.10.0 2023年11月26日

#185 in 身份验证

Download history 100/week @ 2024-07-02

每月100次下载

MIT/Apache

46KB
1K SLoC

Brize Auth

一个微小的异步身份验证库。

摘要

一个简化Rust生态系统身份验证的工具。有意构建以与您的特定业务/模式逻辑无关。主要控制用户的 凭证,并可选项地管理 会话。使用Tokio运行时异步构建,并支持MySql和SurrealDB。

凭证

Brize auth 凭证有三个字段,一个 id 用于链接到您的特定业务/模式逻辑,一个 user_identity,它应该是一个识别用户的方式,例如电子邮件,以及一个 hashed_password。这将存储在数据库中的 user_credentials 表中。

会话

会话是可选的,如果您想使用其他会话解决方案。如果您启用 会话,Brize auth提供经典的表会话,其中 id 字段作为令牌,created_atexpired_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