use biscuit::CompactJson;
use chrono::Duration;
use crate::{
Claims, Configurable, IdToken, Provider, Token,
client::Client,
error::Error,
validation::{validate_token_aud, validate_token_exp, validate_token_nonce},
};
pub async fn authenticate<C: CompactJson + Claims, P: Provider + Configurable>(
client: &Client<P, C>,
auth_code: &str,
nonce: Option<&str>,
max_age: Option<&Duration>,
) -> Result<Token<C>, Error> {
let bearer = client.request_token(auth_code).await.map_err(Error::from)?;
let mut token: Token<C> = bearer.into();
if let Some(id_token) = token.id_token.as_mut() {
client.decode_token(id_token)?;
validate_token(client, id_token, nonce, max_age)?;
}
Ok(token)
}
pub fn validate_token<C: CompactJson + Claims, P: Provider + Configurable>(
client: &Client<P, C>,
token: &IdToken<C>,
nonce: Option<&str>,
max_age: Option<&Duration>,
) -> Result<(), Error> {
let claims = token.payload()?;
validate_token_nonce(claims, nonce)?;
validate_token_aud(claims, &client.client_id)?;
validate_token_exp(claims, max_age)?;
Ok(())
}