#![deny(rust_2018_idioms)]
pub mod guard;
pub mod jwt_verify;
pub mod types;
pub mod vps_client;
pub mod well_known;
pub mod jwt {
pub use crate::jwt_verify::{extract_bearer, JwtVerifier, VerifiedJwt};
}
pub mod vps {
pub use crate::vps_client::{ChallengeMeta, ChallengeResponse, SubmitResponse, VpsClient};
}
pub use jwt_verify::JwtVerifier;
pub use types::{
Difficulty, FailMode, FdkeyConfig, FdkeyContext, FdkeyError, Policy,
SessionState, VerifiedClaims,
};
pub use vps_client::{ChallengeMeta, ChallengeResponse, SubmitResponse, VpsClient};
pub use well_known::WellKnownClient;
pub struct Verifier {
pub jwt: JwtVerifier,
pub vps: VpsClient,
}
impl Verifier {
pub fn new(config: &FdkeyConfig) -> Result<Self, FdkeyError> {
Self::with_client_type(config, "rest")
}
pub fn new_mcp(config: &FdkeyConfig) -> Result<Self, FdkeyError> {
Self::with_client_type(config, "mcp")
}
fn with_client_type(
config: &FdkeyConfig,
client_type: &'static str,
) -> Result<Self, FdkeyError> {
let vps_url = config
.vps_url
.clone()
.unwrap_or_else(|| "https://api.fdkey.com".to_string());
let well_known = WellKnownClient::new(&vps_url)?;
let jwt = JwtVerifier::new(well_known);
let vps = VpsClient::new(
vps_url,
config.api_key.clone(),
config.difficulty,
client_type,
)?;
Ok(Self { jwt, vps })
}
pub async fn verify_token(&self, token: &str) -> Result<jwt::VerifiedJwt, FdkeyError> {
self.jwt.verify(token).await
}
}