11use std:: marker:: PhantomData ;
22
3- use async_trait :: async_trait ;
3+ use axum :: RequestPartsExt ;
44use axum:: extract:: FromRef ;
5- use axum:: http:: { header:: HeaderName , StatusCode } ;
5+ use axum:: http:: { StatusCode , header:: HeaderName } ;
66use axum:: response:: Response ;
7- use axum:: RequestPartsExt ;
87use axum:: { http:: request:: Parts , response:: IntoResponse } ;
8+ use axum_extra:: TypedHeader ;
99use axum_extra:: headers:: authorization:: Bearer ;
1010use axum_extra:: headers:: { Authorization , Cookie } ;
11- use axum_extra:: TypedHeader ;
1211use jsonwebtoken:: errors:: ErrorKind ;
1312use serde:: de:: DeserializeOwned ;
1413
@@ -50,20 +49,20 @@ pub struct Claims<T, E = BearerTokenExtractor> {
5049///
5150/// Implement this trait to define custom token extraction strategies.
5251/// The library provides implementations for common sources via the extractor macros.
53- #[ async_trait]
54- pub trait TokenExtractor {
52+ pub trait TokenExtractor : Send + Sync {
5553 /// Extracts a JWT token string from the request parts.
5654 ///
5755 /// Returns `AuthError::MissingToken` if the token cannot be found or extracted.
58- async fn extract_token ( parts : & mut Parts ) -> Result < String , AuthError > ;
56+ fn extract_token (
57+ parts : & mut Parts ,
58+ ) -> impl std:: future:: Future < Output = Result < String , AuthError > > + Send ;
5959}
6060
6161/// Extracts JWT tokens from the `Authorization: Bearer <token>` header.
6262///
6363/// This is the default extractor used by `Claims<T>` when no extractor is specified.
6464pub struct BearerTokenExtractor ;
6565
66- #[ async_trait]
6766impl TokenExtractor for BearerTokenExtractor {
6867 async fn extract_token ( parts : & mut Parts ) -> Result < String , AuthError > {
6968 let auth: TypedHeader < Authorization < Bearer > > =
@@ -77,7 +76,7 @@ impl TokenExtractor for BearerTokenExtractor {
7776///
7877/// Implement this trait to specify custom header names or cookie names
7978/// Typically used with the `define_*_extractor!` macros rather than implemented manually.
80- pub trait ExtractorConfig {
79+ pub trait ExtractorConfig : Send + Sync {
8180 /// Returns the header name or cookie name to extract from.
8281 fn value ( ) -> & ' static str ;
8382}
@@ -147,7 +146,6 @@ macro_rules! define_cookie_extractor {
147146/// ```
148147pub struct HeaderTokenExtractor < C : ExtractorConfig > ( PhantomData < C > ) ;
149148
150- #[ async_trait]
151149impl < C : ExtractorConfig > TokenExtractor for HeaderTokenExtractor < C > {
152150 async fn extract_token ( parts : & mut Parts ) -> Result < String , AuthError > {
153151 let header_name = HeaderName :: from_static ( C :: value ( ) ) ;
@@ -176,7 +174,6 @@ impl<C: ExtractorConfig> TokenExtractor for HeaderTokenExtractor<C> {
176174/// ```
177175pub struct CookieTokenExtractor < C : ExtractorConfig > ( PhantomData < C > ) ;
178176
179- #[ async_trait]
180177impl < C : ExtractorConfig > TokenExtractor for CookieTokenExtractor < C > {
181178 async fn extract_token ( parts : & mut Parts ) -> Result < String , AuthError > {
182179 let cookies: TypedHeader < Cookie > =
0 commit comments