#[cfg(feature = "auth")]
use crate::auth::{AuthClaims, AuthenticationError, IntrospectionResponse};
use crate::{auth::Audience, utils::unix_timestamp_to_systemtime};
#[cfg(feature = "auth")]
use jsonwebtoken::TokenData;
use serde::{Deserialize, Serialize};
use serde_json::Map;
use std::time::SystemTime;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuthInfo {
pub token_unique_id: String,
#[serde(skip_serializing_if = "std::option::Option::is_none")]
pub client_id: Option<String>,
#[serde(skip_serializing_if = "std::option::Option::is_none")]
pub user_id: Option<String>,
#[serde(skip_serializing_if = "std::option::Option::is_none")]
pub scopes: Option<Vec<String>>,
#[serde(skip_serializing_if = "std::option::Option::is_none")]
pub expires_at: Option<SystemTime>,
#[serde(skip_serializing_if = "std::option::Option::is_none")]
pub audience: Option<Audience>,
#[serde(flatten, skip_serializing_if = "std::option::Option::is_none")]
pub extra: Option<Map<String, serde_json::Value>>,
}
#[cfg(feature = "auth")]
impl AuthInfo {
pub fn from_token_data(
token: String,
token_data: TokenData<AuthClaims>,
extra: Option<Map<String, serde_json::Value>>,
) -> Result<Self, AuthenticationError> {
let client_id = token_data.claims.authorized_party.or(token_data
.claims
.client_id
.or(token_data.claims.application_id));
let scopes = token_data
.claims
.scope
.map(|c| c.split(" ").map(|s| s.to_string()).collect::<Vec<_>>());
let expires_at = token_data
.claims
.expiration
.map(|v| unix_timestamp_to_systemtime(v as u64));
let token_unique_id = token_data.claims.jwt_id.unwrap_or(token);
Ok(AuthInfo {
token_unique_id,
client_id,
scopes,
user_id: token_data.claims.subject,
expires_at,
audience: token_data.claims.audience,
extra,
})
}
pub fn from_introspection_response(
token: String,
data: IntrospectionResponse,
extra: Option<Map<String, serde_json::Value>>,
) -> Result<Self, AuthenticationError> {
let scopes = data
.scope
.map(|c| c.split(" ").map(|s| s.to_string()).collect::<Vec<_>>());
let expires_at = data
.expiration
.map(|v| unix_timestamp_to_systemtime(v as u64));
let token_unique_id = data.jwt_id.unwrap_or(token);
Ok(AuthInfo {
token_unique_id,
client_id: data.client_id,
user_id: data.subject,
scopes,
expires_at,
audience: data.audience,
extra,
})
}
}