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 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}