Skip to main content

axum_security/jwt/
service.rs

1use std::task::{Context, Poll};
2
3use axum::extract::Request;
4use serde::de::DeserializeOwned;
5use tower::{Layer, Service};
6
7use crate::jwt::{Jwt, JwtContext};
8
9pub struct JwtService<T, SERV> {
10    inner: JwtContext<T>,
11    rest: SERV,
12}
13
14impl<T, SERV> Service<Request> for JwtService<T, SERV>
15where
16    SERV: Service<Request>,
17    T: DeserializeOwned + Send + Sync + 'static + Clone,
18{
19    type Response = <SERV>::Response;
20
21    type Error = <SERV>::Error;
22
23    type Future = <SERV>::Future;
24
25    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
26        self.rest.poll_ready(cx)
27    }
28
29    fn call(&mut self, mut req: Request) -> Self::Future {
30        if let Some(user) = self.inner.decode_from_headers(req.headers()) {
31            req.extensions_mut().insert(Jwt(user));
32        }
33        self.rest.call(req)
34    }
35}
36
37impl<SERV, T> Layer<SERV> for JwtContext<T>
38where
39    T: 'static,
40{
41    type Service = JwtService<T, SERV>;
42
43    fn layer(&self, inner: SERV) -> Self::Service {
44        JwtService {
45            inner: self.clone(),
46            rest: inner,
47        }
48    }
49}
50
51impl<T, SERV> Clone for JwtService<T, SERV>
52where
53    SERV: Clone,
54{
55    fn clone(&self) -> Self {
56        Self {
57            inner: self.inner.clone(),
58            rest: self.rest.clone(),
59        }
60    }
61}