use warp::{Filter, Rejection, reject};
use uuid::Uuid;
use super::jwt::verify_token;
#[derive(Debug)]
pub struct Unauthorized;
impl reject::Reject for Unauthorized {}
pub fn with_auth(
jwt_secret: String,
) -> impl Filter<Extract = (Uuid,), Error = Rejection> + Clone {
warp::header::optional::<String>("authorization")
.and_then(move |auth_header: Option<String>| {
let secret = jwt_secret.clone();
async move {
match auth_header {
Some(header) => {
let token = header
.strip_prefix("Bearer ")
.ok_or_else(|| reject::custom(Unauthorized))?;
let claims = verify_token(token, &secret)
.map_err(|_| reject::custom(Unauthorized))?;
let user_id = Uuid::parse_str(&claims.sub)
.map_err(|_| reject::custom(Unauthorized))?;
Ok(user_id)
}
None => Err(reject::custom(Unauthorized)),
}
}
})
}