#tower-sessions #firestore #session #session-store #tower #axum

tower-sessions-firestore-store

tower-sessions使用Cloud Firestore存储

2个不稳定版本

0.2.1 2024年2月20日
0.2.0 2024年2月19日
0.1.1 2024年1月20日

#8 in #session-store

41 每月下载量

MIT 许可证

18KB
129 代码行

tower-sessions-firestore-store

tower-sessions使用Cloud Firestore存储

概述

此包提供Cloud Firestore存储,用于tower-sessions

📦 安装

要将此包用于您的项目,请在您的Cargo.toml文件中添加以下内容

[dependencies]
firestore = "0.39"
tower-sessions = "0.10"
tower-sessions-firestore-store = "0.2"

用法

设置一个Firestore数据库,并使用此数据库和集合名称配置存储。可以使用Firestore EmulatorFirebase Emulator UI进行本地测试。

axum 示例

use std::net::SocketAddr;

use axum::{response::IntoResponse, routing::get, Router};
use firestore::FirestoreDb;
use serde::{Deserialize, Serialize};
use time::Duration;
use tower_sessions::{Expiry, Session, SessionManagerLayer};
use tower_sessions_firestore_store::FirestoreStore;

const COUNTER_KEY: &str = "counter";

#[derive(Default, Deserialize, Serialize)]
struct Counter(usize);

#[tokio::main]
async fn main() {
    let google_cloud_project = std::option_env!("GOOGLE_CLOUD_PROJECT")
        .expect("Missing GOOGLE_CLOUD_PROJECT.")
        .to_string();
    let db = FirestoreDb::new(google_cloud_project)
        .await
        .expect("Could not create FirestoreDb.");

    let session_store = FirestoreStore::new(db, "tower-sessions".to_string());
    let session_layer = SessionManagerLayer::new(session_store)
        .with_secure(false)
        .with_expiry(Expiry::OnInactivity(Duration::seconds(10)));

    let app = Router::new().route("/", get(handler)).layer(session_layer);

    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
    let listener = tokio::net::TcpListener::bind(&addr).await.unwrap();
    axum::serve(listener, app.into_make_service())
        .await
        .unwrap();
}

async fn handler(session: Session) -> impl IntoResponse {
    let counter: Counter = session.get(COUNTER_KEY).await.unwrap().unwrap_or_default();
    session.insert(COUNTER_KEY, counter.0 + 1).await.unwrap();
    format!("Current count: {}", counter.0)
}

您可以在此示例中找到示例目录

依赖项

~110MB
~1.5M SLoC