-
Notifications
You must be signed in to change notification settings - Fork 19
Description
Hi, thank you for the wonderful crate!
I have a question regarding the implementation of FirebaseAuth. Since FirebaseAuth implements Clone, it can be cloned. Additionally, it also implements Drop, which stops the updates of public keys when the instance is dropped. Therefore, it appears that dropping a cloned FirebaseAuth also stops keys updates.
This behavior can potentially lead to unintentional stopping of key updates due to cloning. I encountered this issue while using the Extension in axum. (I am aware of the axum feature, but in my case, a Firebase auth token is passed via a different header. I was able to resolve this issue by wrapping FirebaseAuth with Arc.)
Could you please clarify whether it is expected for FirebaseAuth to implement Clone? Is there a way to ensure that dropping a naive cloned FirebaseAuth does not stop keys updates?
Repro
Patched Drop for FirebaseAuth
impl Drop for FirebaseAuth {
fn drop(&mut self) {
debug!("Abort the handler");
// Stop the update thread when the updater is destructed
let handler = self.handler.lock().unwrap();
handler.abort();
}
}use std::time::Duration;
use anyhow::Result;
use firebase_auth::{FirebaseAuth, FirebaseUser};
use tracing_subscriber::{fmt, layer::SubscriberExt as _, util::SubscriberInitExt as _, EnvFilter};
#[tokio::main]
async fn main() -> Result<()> {
tracing_subscriber::registry()
.with(fmt::layer())
.with(EnvFilter::from_default_env())
.init();
let auth: FirebaseAuth = FirebaseAuth::new("sample_project_id").await;
tokio::time::sleep(Duration::from_secs(3)).await;
// Clone and drop
let cloned = auth.clone();
drop(cloned);
// A long time have passed...
tokio::time::sleep(Duration::from_secs(10_000_000)).await;
// Fail?
let _ = auth.verify::<FirebaseUser>("token");
Ok(())
}$ RUST_LOG=info,firebase_auth=debug cargo run
Compiling fba v0.1.0 (/workspace)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 2.38s
Running `target/debug/fba`
2024-07-11T06:08:00.231661Z DEBUG firebase_auth::firebase_auth: Updated JWK keys. Next refresh will be in 22344s
2024-07-11T06:08:03.141457Z DEBUG firebase_auth::firebase_auth: Abort the handlerVersion
rust 1.79.0
firebase-auth 0.4.3