actix_web_security/authentication/scheme/bearer/jwk/
mod.rs

1//! The jwk module provides utility functions to load JWKs to use for verification of JWTs.
2
3use std::fs;
4
5use serde::Deserialize;
6
7use crate::authentication::error::error_type::JwkLoaderError;
8
9pub mod default_jwk;
10
11#[cfg(feature = "jwk-default-loader")]
12pub mod default_jwk_loader;
13
14/// JWK loader definition
15pub struct JwkLoader<T: for<'a> Deserialize<'a>> {
16    pub jwks: T,
17}
18
19impl<T: for<'a> Deserialize<'a>> JwkLoader<T> {
20    /// Load a JWK file from disk.
21    pub fn from_file(filename: String) -> Result<JwkLoader<T>, JwkLoaderError> {
22        match fs::read_to_string(filename) {
23            Ok(key) => match serde_json::from_str(key.as_str()) {
24                Ok(jwks) => Ok(JwkLoader { jwks }),
25                Err(_) => Err(JwkLoaderError::InvalidKeyFile),
26            },
27            Err(_) => Err(JwkLoaderError::KeyFileCouldNotBeRead),
28        }
29    }
30
31    /// Download a JWK file from a remote location with http.
32    #[cfg(feature = "jwk-loader")]
33    pub fn from_url(url: String) -> Result<JwkLoader<T>, JwkLoaderError> {
34        match reqwest::blocking::get(&url) {
35            Ok(response) => match response.json::<T>() {
36                Ok(jwks) => Ok(JwkLoader { jwks }),
37                Err(_) => Err(JwkLoaderError::InvalidJsonResponse),
38            },
39            Err(_) => Err(JwkLoaderError::JwksCouldNotBeDownloaded),
40        }
41    }
42}