use anyhow::Result;
use pdk::hl::*;
use pdk::jwt::*;
// [...]
async fn filter(
state: RequestState,
signature_validator: &SignatureValidator,
) -> Flow<()> {
let headers_state = state.into_headers_state().await;
// Extract token
let token = TokenProvider::bearer(headers_state.handler())?;
if token.is_err() {
return Flow::Break(Response::new(401).with_body("Bearer not found"));
}
// Validating signature
let claims = signature_validator.validate(token.unwrap());
if claims.is_err() {
return Flow::Break(Response::new(401).with_body("Invalid token"));
}
// [...]
}
#[entrypoint]
async fn configure(launcher: Launcher, Configuration(configuration): Configuration) -> Result<()> {
let config: Config = serde_json::from_slice(&configuration)?;
let signature_validator = SignatureValidator::new(
model::SigningAlgorithm::Hmac,
model::SigningKeyLength::Len256,
config.secret.clone(),
)?;
launcher
.launch(on_request(|request| {
filter(request, &signature_validator)
}))
.await?;
Ok(())
}