use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JwtClaims {
pub sub: String,
pub iss: String,
pub aud: Audience,
pub exp: usize,
#[serde(default)]
pub org_id: Option<String>,
#[serde(default)]
pub organization_membership_id: Option<String>,
#[serde(default)]
pub role: Option<String>,
#[serde(default)]
pub permissions: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Audience {
Single(String),
Multiple(Vec<String>),
}
impl Audience {
pub(super) fn contains(&self, needle: &str) -> bool {
match self {
Self::Single(value) => value == needle,
Self::Multiple(values) => values.iter().any(|value| value == needle),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct VerifiedSubject {
pub subject: String,
pub org_id: Option<String>,
pub organization_membership_id: Option<String>,
pub roles: Vec<String>,
pub permissions: Vec<String>,
}
impl VerifiedSubject {
pub fn workos_membership_subject(&self) -> &str {
self.organization_membership_id
.as_deref()
.unwrap_or(&self.subject)
}
}
impl From<JwtClaims> for VerifiedSubject {
fn from(claims: JwtClaims) -> Self {
Self {
subject: claims.sub,
org_id: claims.org_id,
organization_membership_id: claims.organization_membership_id,
roles: claims.role.into_iter().collect(),
permissions: claims.permissions,
}
}
}