firebase_verifyid/
token_verifier.rs1use super::{Error, FirebaseClaims, Settings};
2use jwt_simple::{
3 algorithms::{RS256PublicKey, RSAPublicKeyLike},
4 claims::JWTClaims,
5 common::VerificationOptions,
6 prelude::Ed25519PublicKey,
7};
8use std::collections::HashMap;
9use tokio::sync::watch;
10
11#[derive(Clone)]
12pub struct TokenVerifier {
13 jwks: watch::Receiver<HashMap<String, RS256PublicKey>>,
14 verify_opts: VerificationOptions,
15 pub(crate) bearer_verifier: Option<Ed25519PublicKey>,
16}
17
18impl TokenVerifier {
19 pub fn new(
20 jwks: watch::Receiver<HashMap<String, RS256PublicKey>>,
21 settings: Settings,
22 ) -> Result<Self, Error> {
23 let bearer_verifier = settings.bearer_pubkey().transpose()?;
24 Ok(Self {
25 jwks,
26 verify_opts: settings.into(),
27 bearer_verifier,
28 })
29 }
30
31 pub fn verify_token(
32 &self,
33 key_id: &str,
34 token: &str,
35 ) -> Result<JWTClaims<FirebaseClaims>, Error> {
36 self.jwks
37 .borrow()
38 .get(key_id)
39 .map(|pubkey| {
40 pubkey.verify_token::<FirebaseClaims>(token, Some(self.verify_opts.clone()))
41 })
42 .ok_or_else(|| Error::UnknownJwk(key_id.to_string()))?
43 .map_err(Error::from)
44 }
45}