use securitydept_utils::principal::AuthenticatedPrincipal;
use crate::{IdTokenClaimsWithExtra, OidcCodeCallbackResult, OidcRefreshTokenResult};
pub type OidcExtractedPrincipal = AuthenticatedPrincipal;
pub fn extract_principal_from_code_callback(
result: &OidcCodeCallbackResult,
) -> OidcExtractedPrincipal {
OidcExtractedPrincipal {
subject: result.id_token_claims.subject().to_string(),
display_name: result.claims_check_result.display_name.clone(),
picture: result.claims_check_result.picture.clone(),
issuer: Some(result.id_token_claims.issuer().url().to_string()),
claims: result.claims_check_result.claims.clone(),
}
}
pub fn extract_principal_from_refresh_result(
result: &OidcRefreshTokenResult,
) -> Option<OidcExtractedPrincipal> {
let claims_check_result = result.claims_check_result.as_ref()?;
let id_token_claims = result.id_token_claims.as_ref()?;
Some(OidcExtractedPrincipal {
subject: id_token_claims.subject().to_string(),
display_name: claims_check_result.display_name.clone(),
picture: claims_check_result.picture.clone(),
issuer: Some(id_token_claims.issuer().url().to_string()),
claims: claims_check_result.claims.clone(),
})
}
pub fn extract_issuer_from_id_token_claims(claims: &IdTokenClaimsWithExtra) -> String {
claims.issuer().url().to_string()
}
pub fn extract_issuer_from_refresh_result(result: &OidcRefreshTokenResult) -> Option<String> {
result
.id_token_claims
.as_ref()
.map(|c| c.issuer().url().to_string())
}
#[cfg(test)]
mod tests {
use chrono::Utc;
use super::*;
#[test]
fn extract_principal_from_refresh_returns_none_without_claims() {
let result = OidcRefreshTokenResult {
access_token: "at".to_string(),
access_token_expiration: Some(Utc::now()),
id_token: None,
refresh_token: None,
id_token_claims: None,
user_info_claims: None,
claims_check_result: None,
};
assert!(extract_principal_from_refresh_result(&result).is_none());
}
}