48 lines
1.2 KiB
Rust
48 lines
1.2 KiB
Rust
use axum::{
|
|
extract::Request,
|
|
http::{StatusCode, header},
|
|
middleware::Next,
|
|
response::Response,
|
|
};
|
|
use sb_auth::jwt::verify_token;
|
|
|
|
#[derive(Clone)]
|
|
pub struct AuthUser {
|
|
pub user_id: u32,
|
|
pub name: String,
|
|
pub role: String,
|
|
}
|
|
|
|
pub async fn auth_middleware(mut request: Request, next: Next) -> Result<Response, StatusCode> {
|
|
let auth_header = request
|
|
.headers()
|
|
.get(header::AUTHORIZATION)
|
|
.and_then(|v| v.to_str().ok())
|
|
.unwrap_or("");
|
|
|
|
let token = auth_header.strip_prefix("Bearer ").unwrap_or(auth_header);
|
|
|
|
if token.is_empty() {
|
|
return Err(StatusCode::UNAUTHORIZED);
|
|
}
|
|
|
|
let claims = verify_token(token).map_err(|_| StatusCode::UNAUTHORIZED)?;
|
|
|
|
request.extensions_mut().insert(AuthUser {
|
|
user_id: claims.sub,
|
|
name: claims.name,
|
|
role: claims.role,
|
|
});
|
|
|
|
Ok(next.run(request).await)
|
|
}
|
|
|
|
impl std::fmt::Debug for AuthUser {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
f.debug_struct("AuthUser")
|
|
.field("user_id", &self.user_id)
|
|
.field("name", &self.name)
|
|
.field("role", &self.role)
|
|
.finish()
|
|
}
|
|
}
|