Skip to content

Commit 76b345c

Browse files
committed
refactor: simplify audiance deserialization
1 parent 172f1e8 commit 76b345c

File tree

1 file changed

+9
-31
lines changed

1 file changed

+9
-31
lines changed

crates/apollo-mcp-server/src/auth/valid_token.rs

Lines changed: 9 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -50,43 +50,21 @@ pub(super) trait ValidateToken {
5050
pub sub: String,
5151
}
5252

53-
/// Custom deserializer to handle both single string and array of strings for audience claim
5453
fn deserialize_audience<'de, D>(deserializer: D) -> Result<Vec<String>, D::Error>
5554
where
5655
D: serde::Deserializer<'de>,
5756
{
58-
use serde::de::{SeqAccess, Visitor};
59-
use std::fmt;
60-
61-
struct AudienceVisitor;
62-
63-
impl<'de> Visitor<'de> for AudienceVisitor {
64-
type Value = Vec<String>;
65-
66-
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
67-
formatter.write_str("a string or array of strings")
68-
}
69-
70-
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
71-
where
72-
E: serde::de::Error,
73-
{
74-
Ok(vec![value.to_string()])
75-
}
76-
77-
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
78-
where
79-
A: SeqAccess<'de>,
80-
{
81-
let mut audiences = Vec::new();
82-
while let Some(aud) = seq.next_element()? {
83-
audiences.push(aud);
84-
}
85-
Ok(audiences)
86-
}
57+
#[derive(Deserialize)]
58+
#[serde(untagged)]
59+
enum Audience {
60+
Single(String),
61+
Multiple(Vec<String>),
8762
}
8863

89-
deserializer.deserialize_any(AudienceVisitor)
64+
Ok(match Audience::deserialize(deserializer)? {
65+
Audience::Single(s) => vec![s],
66+
Audience::Multiple(v) => v,
67+
})
9068
}
9169

9270
let jwt = token.token();

0 commit comments

Comments
 (0)