axum_security/jwt/
service.rs1use 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 crate::debug!("jwt: token extracted");
32 req.extensions_mut().insert(Jwt(user));
33 } else {
34 crate::debug!("jwt: no token in request");
35 }
36 self.rest.call(req)
37 }
38}
39
40impl<SERV, T> Layer<SERV> for JwtContext<T>
41where
42 T: 'static,
43{
44 type Service = JwtService<T, SERV>;
45
46 fn layer(&self, inner: SERV) -> Self::Service {
47 JwtService {
48 inner: self.clone(),
49 rest: inner,
50 }
51 }
52}
53
54impl<T, SERV> Clone for JwtService<T, SERV>
55where
56 SERV: Clone,
57{
58 fn clone(&self) -> Self {
59 Self {
60 inner: self.inner.clone(),
61 rest: self.rest.clone(),
62 }
63 }
64}