use cheers_core::{Claims, Error, PeerKey, TokenVerifier};
use crate::revocation::RevocationReader;
pub struct EdgeVerifier<V, Rd> {
verifier: V,
revoked: Rd,
}
impl<V, Rd> EdgeVerifier<V, Rd>
where
V: TokenVerifier + Send + Sync,
Rd: RevocationReader,
{
pub fn new(verifier: V, revoked: Rd) -> Self {
Self { verifier, revoked }
}
pub async fn verify_at(&self, token: &str, now: i64) -> Result<Claims, Error> {
let claims = self.verifier.verify_at(token, now)?;
if self.revoked.is_revoked(&claims.jti).await? {
return Err(Error::Revoked);
}
Ok(claims)
}
pub async fn verify_bound_at(
&self,
token: &str,
presented: &PeerKey,
now: i64,
) -> Result<Claims, Error> {
let claims = self.verifier.verify_at(token, now)?;
if !claims.is_bound_to(presented) {
return Err(Error::PeerKeyMismatch);
}
if self.revoked.is_revoked(&claims.jti).await? {
return Err(Error::Revoked);
}
Ok(claims)
}
}