Lines
31.25 %
Functions
2.22 %
Branches
100 %
use crate::error::{Error, Result};
use actix_http::{HttpMessage, Payload};
use actix_web::{error::ErrorInternalServerError, FromRequest, HttpRequest};
use jsonwebtoken::{decode, DecodingKey, Validation};
use serde::{Deserialize, Serialize};
use std::{
future::{ready, Ready},
path::Path,
};
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Claims {
pub username: String,
pub organization: String,
pub email: String,
pub exp: u64,
}
/// An implementaion of `FromRequest` makes it possible to extract the
/// claims the request handling signature.
impl FromRequest for Claims {
type Error = actix_web::Error;
type Future = Ready<std::result::Result<Claims, actix_web::Error>>;
fn from_request(req: &HttpRequest, _payload: &mut Payload) -> Self::Future {
Self::extract(req)
fn extract(req: &HttpRequest) -> Self::Future {
let ext = req.extensions();
match ext.get::<Claims>() {
Some(claims) => ready(Ok(claims.clone())),
None => ready(Err(ErrorInternalServerError(
"No JWT claims were present.".to_string(),
))),
pub fn validate_token(token: &str, jwt_secret: &[u8]) -> Result<Claims> {
let validation = Validation::default();
let token = decode::<Claims>(token, &DecodingKey::from_secret(jwt_secret), &validation)?;
Ok(token.claims)
pub fn load_jwks(path: &Path) -> Result<Jwks> {
let path = path.join("jwt_secret");
let bytes = std::fs::read(&path).map_err(|e| Error::Io {
source: e,
path: path.clone(),
})?;
let content = String::from_utf8(bytes)
.map_err(|e| Error::Utf8 { source: e, path })?
.trim()
.to_string();
Ok(Jwks { secret: content })
#[derive(Clone)]
pub struct Jwks {
secret: String,
impl Jwks {
pub fn secret(&self) -> &[u8] {
self.secret.as_bytes()