Trait actix_jwt_session::SessionExtractor
source · pub trait SessionExtractor<ClaimsType: Claims>: Send + Sync + 'static {
// Required method
fn extract_token_text<'req, 'life0, 'async_trait>(
&'life0 self,
req: &'req mut ServiceRequest
) -> Pin<Box<dyn Future<Output = Option<Cow<'req, str>>> + 'async_trait>>
where Self: 'async_trait,
'req: 'async_trait,
'life0: 'async_trait;
// Provided methods
fn extract_claims<'life0, 'life1, 'async_trait>(
&'life0 self,
req: &'life1 mut ServiceRequest,
jwt_encoding_key: Arc<EncodingKey>,
jwt_decoding_key: Arc<DecodingKey>,
algorithm: Algorithm,
storage: SessionStorage
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait { ... }
fn decode(
&self,
value: &str,
jwt_decoding_key: Arc<DecodingKey>,
algorithm: Algorithm
) -> Result<ClaimsType, Error> { ... }
fn validate<'life0, 'life1, 'async_trait>(
&'life0 self,
claims: &'life1 ClaimsType,
storage: SessionStorage
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait { ... }
}Expand description
Trait allowing to extract JWt token from actix_web::dev::ServiceRequest
Two extractor are implemented by default
- HeaderExtractor which is best for any PWA or micro services requests
- CookieExtractor which is best for simple server with session stored in cookie
It’s possible to implement GraphQL, JSON payload or query using req.extract::<JSON<YourStruct>>() if this is needed.
All implementation can use SessionExtractor::decode method for decoding raw JWT string into Claims and then SessionExtractor::validate to validate claims agains session stored in SessionStorage
Required Methods§
sourcefn extract_token_text<'req, 'life0, 'async_trait>(
&'life0 self,
req: &'req mut ServiceRequest
) -> Pin<Box<dyn Future<Output = Option<Cow<'req, str>>> + 'async_trait>>where
Self: 'async_trait,
'req: 'async_trait,
'life0: 'async_trait,
fn extract_token_text<'req, 'life0, 'async_trait>( &'life0 self, req: &'req mut ServiceRequest ) -> Pin<Box<dyn Future<Output = Option<Cow<'req, str>>> + 'async_trait>>where Self: 'async_trait, 'req: 'async_trait, 'life0: 'async_trait,
Lookup for session data as a string in actix_web::dev::ServiceRequest
If there’s no token data in request you should returns None. This is not considered as an
error and until endpoint requires Authenticated this will not results in 401.
Provided Methods§
sourcefn extract_claims<'life0, 'life1, 'async_trait>(
&'life0 self,
req: &'life1 mut ServiceRequest,
jwt_encoding_key: Arc<EncodingKey>,
jwt_decoding_key: Arc<DecodingKey>,
algorithm: Algorithm,
storage: SessionStorage
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn extract_claims<'life0, 'life1, 'async_trait>( &'life0 self, req: &'life1 mut ServiceRequest, jwt_encoding_key: Arc<EncodingKey>, jwt_decoding_key: Arc<DecodingKey>, algorithm: Algorithm, storage: SessionStorage ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + 'async_trait>>where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,
Extract claims from actix_web::dev::ServiceRequest
Examples:
use actix_web::dev::ServiceRequest;
use jsonwebtoken::*;
use actix_jwt_session::*;
use std::sync::Arc;
use actix_web::HttpMessage;
use std::borrow::Cow;
#[derive(Debug, Clone, Copy, Default)]
struct ExampleExtractor;
#[async_trait::async_trait(?Send)]
impl SessionExtractor<Claims> for ExampleExtractor {
async fn extract_claims(
&self,
req: &mut ServiceRequest,
jwt_encoding_key: Arc<EncodingKey>,
jwt_decoding_key: Arc<DecodingKey>,
algorithm: Algorithm,
storage: SessionStorage,
) -> Result<(), Error> {
if req.peer_addr().unwrap().ip().is_multicast() {
req.extensions_mut().insert(Authenticated {
claims: Arc::new(Claims { id: uuid::Uuid::default(), sub: "HUB".into() }),
jwt_encoding_key,
algorithm,
});
}
Ok(())
}
async fn extract_token_text<'req>(&self, req: &'req mut ServiceRequest) -> Option<Cow<'req, str>> { None }
}sourcefn decode(
&self,
value: &str,
jwt_decoding_key: Arc<DecodingKey>,
algorithm: Algorithm
) -> Result<ClaimsType, Error>
fn decode( &self, value: &str, jwt_decoding_key: Arc<DecodingKey>, algorithm: Algorithm ) -> Result<ClaimsType, Error>
Decode encrypted JWT to structure
sourcefn validate<'life0, 'life1, 'async_trait>(
&'life0 self,
claims: &'life1 ClaimsType,
storage: SessionStorage
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn validate<'life0, 'life1, 'async_trait>( &'life0 self, claims: &'life1 ClaimsType, storage: SessionStorage ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + 'async_trait>>where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,
Validate JWT Claims agains stored in storage tokens.
- Token must exists in storage
- Token must be exactly the same as token from storage