Skip to content

Commit 0252532

Browse files
committed
Revert "Add IdTokenVerifier::require_typ_check method (#175)"
This reverts commit e28f85a.
1 parent e28f85a commit 0252532

2 files changed

Lines changed: 12 additions & 78 deletions

File tree

src/verification/mod.rs

Lines changed: 8 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,6 @@ where
125125
iss_required: bool,
126126
issuer: IssuerUrl,
127127
is_signature_check_enabled: bool,
128-
is_typ_check_enabled: bool,
129128
other_aud_verifier_fn: Arc<dyn Fn(&Audience) -> bool + 'a + Send + Sync>,
130129
signature_keys: JsonWebKeySet<K>,
131130
}
@@ -147,7 +146,6 @@ where
147146
iss_required: true,
148147
issuer,
149148
is_signature_check_enabled: true,
150-
is_typ_check_enabled: true,
151149
// Secure default: reject all other audiences as untrusted, since any other audience
152150
// can potentially impersonate the user when by sending its copy of these claims
153151
// to this relying party.
@@ -171,11 +169,6 @@ where
171169
self
172170
}
173171

174-
pub fn require_typ_check(mut self, typ_check_required: bool) -> Self {
175-
self.is_typ_check_enabled = typ_check_required;
176-
self
177-
}
178-
179172
pub fn set_allowed_algs<I>(mut self, algs: I) -> Self
180173
where
181174
I: IntoIterator<Item = K::SigningAlgorithm>,
@@ -202,23 +195,20 @@ where
202195
}
203196

204197
fn validate_jose_header<JE>(
205-
&self,
206198
jose_header: &JsonWebTokenHeader<JE, K::SigningAlgorithm>,
207199
) -> Result<(), ClaimsVerificationError>
208200
where
209201
JE: JweContentEncryptionAlgorithm<
210202
KeyType = <K::SigningAlgorithm as JwsSigningAlgorithm>::KeyType,
211203
>,
212204
{
213-
if self.is_typ_check_enabled {
214-
// The 'typ' header field must either be omitted or have the canonicalized value JWT.
215-
if let Some(ref jwt_type) = jose_header.typ {
216-
if jwt_type.to_uppercase() != "JWT" {
217-
return Err(ClaimsVerificationError::Unsupported(format!(
218-
"unexpected or unsupported JWT type `{}`",
219-
**jwt_type
220-
)));
221-
}
205+
// The 'typ' header field must either be omitted or have the canonicalized value JWT.
206+
if let Some(ref jwt_type) = jose_header.typ {
207+
if jwt_type.to_uppercase() != "JWT" {
208+
return Err(ClaimsVerificationError::Unsupported(format!(
209+
"unexpected or unsupported JWT type `{}`",
210+
**jwt_type
211+
)));
222212
}
223213
}
224214
// The 'cty' header field must be omitted, since it's only used for JWTs that contain
@@ -260,7 +250,7 @@ where
260250
{
261251
{
262252
let jose_header = jwt.unverified_header();
263-
self.validate_jose_header(jose_header)?;
253+
Self::validate_jose_header(jose_header)?;
264254

265255
// The code below roughly follows the validation steps described in
266256
// https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation
@@ -624,14 +614,6 @@ where
624614
self
625615
}
626616

627-
/// Specifies whether the `typ` field in the [JOSE header](
628-
/// https://tools.ietf.org/html/rfc7519#section-5) should be validated against supported
629-
/// values.
630-
pub fn require_typ_check(mut self, typ_check_required: bool) -> Self {
631-
self.jwt_verifier = self.jwt_verifier.require_typ_check(typ_check_required);
632-
self
633-
}
634-
635617
/// Specifies whether the issuer claim must match the expected issuer URL for the provider.
636618
pub fn require_issuer_match(mut self, iss_required: bool) -> Self {
637619
self.jwt_verifier = self.jwt_verifier.require_issuer_match(iss_required);

src/verification/tests.rs

Lines changed: 4 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -36,25 +36,9 @@ fn assert_unsupported<T>(result: Result<T, ClaimsVerificationError>, expected_su
3636

3737
#[test]
3838
fn test_jose_header() {
39-
let client_id = ClientId::new("my_client".to_string());
40-
let issuer = IssuerUrl::new("https://example.com".to_string()).unwrap();
41-
let verifier = CoreJwtClaimsVerifier::new(
42-
client_id.clone(),
43-
issuer.clone(),
44-
CoreJsonWebKeySet::new(vec![]),
45-
);
46-
47-
// No typ
48-
verifier
49-
.validate_jose_header(
50-
&serde_json::from_str::<CoreJsonWebTokenHeader>("{\"alg\":\"RS256\"}")
51-
.expect("failed to deserialize"),
52-
)
53-
.expect("JWT typ field was required");
54-
5539
// Unexpected JWT type.
5640
assert_unsupported(
57-
verifier.validate_jose_header(
41+
CoreJwtClaimsVerifier::validate_jose_header(
5842
&serde_json::from_str::<CoreJsonWebTokenHeader>(
5943
"{\"alg\":\"RS256\",\"typ\":\"NOT_A_JWT\"}",
6044
)
@@ -65,14 +49,14 @@ fn test_jose_header() {
6549

6650
// Nested JWTs.
6751
assert_unsupported(
68-
verifier.validate_jose_header(
52+
CoreJwtClaimsVerifier::validate_jose_header(
6953
&serde_json::from_str::<CoreJsonWebTokenHeader>("{\"alg\":\"RS256\",\"cty\":\"JWT\"}")
7054
.expect("failed to deserialize"),
7155
),
7256
"nested JWT",
7357
);
7458
assert_unsupported(
75-
verifier.validate_jose_header(
59+
CoreJwtClaimsVerifier::validate_jose_header(
7660
&serde_json::from_str::<CoreJsonWebTokenHeader>(
7761
"{\"alg\":\"RS256\",\"cty\":\"NOT_A_JWT\"}",
7862
)
@@ -83,7 +67,7 @@ fn test_jose_header() {
8367

8468
// Critical fields. Adapted from https://tools.ietf.org/html/rfc7515#appendix-E
8569
assert_unsupported(
86-
verifier.validate_jose_header(
70+
CoreJwtClaimsVerifier::validate_jose_header(
8771
&serde_json::from_str::<CoreJsonWebTokenHeader>(
8872
"{\
8973
\"alg\":\"RS256\",\
@@ -97,38 +81,6 @@ fn test_jose_header() {
9781
);
9882
}
9983

100-
#[test]
101-
fn test_jose_header_typ_check_disabled() {
102-
let client_id = ClientId::new("my_client".to_string());
103-
let issuer = IssuerUrl::new("https://example.com".to_string()).unwrap();
104-
105-
// Build a verifier that does *not* check the value of `typ`.
106-
let verifier = CoreJwtClaimsVerifier::new(
107-
client_id.clone(),
108-
issuer.clone(),
109-
CoreJsonWebKeySet::new(vec![]),
110-
)
111-
.require_typ_check(false);
112-
113-
// No typ
114-
verifier
115-
.validate_jose_header(
116-
&serde_json::from_str::<CoreJsonWebTokenHeader>("{\"alg\":\"RS256\"}")
117-
.expect("failed to deserialize"),
118-
)
119-
.expect("JWT typ field was required");
120-
121-
// Unsupported typ value
122-
verifier
123-
.validate_jose_header(
124-
&serde_json::from_str::<CoreJsonWebTokenHeader>(
125-
"{\"alg\":\"RS256\",\"typ\":\"NOT_A_JWT\"}",
126-
)
127-
.expect("failed to deserialize"),
128-
)
129-
.expect("any typ value is allowed");
130-
}
131-
13284
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
13385
struct TestClaims {
13486
aud: Option<Vec<Audience>>,

0 commit comments

Comments
 (0)