Skip to content

Commit b40c6ed

Browse files
authored
Fix spec compliance of upstream OAuth 2.0 client auth methods (element-hq#4819)
2 parents 3a8d4dc + 506f162 commit b40c6ed

File tree

2 files changed

+12
-19
lines changed

2 files changed

+12
-19
lines changed

crates/oidc-client/src/types/client_credentials.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ impl ClientCredentials {
141141
let request = match self {
142142
ClientCredentials::None { client_id } => request.form(&RequestWithClientCredentials {
143143
body: form,
144-
client_id,
144+
client_id: Some(client_id),
145145
client_secret: None,
146146
client_assertion: None,
147147
client_assertion_type: None,
@@ -159,7 +159,7 @@ impl ClientCredentials {
159159
.basic_auth(username, Some(password))
160160
.form(&RequestWithClientCredentials {
161161
body: form,
162-
client_id,
162+
client_id: None,
163163
client_secret: None,
164164
client_assertion: None,
165165
client_assertion_type: None,
@@ -171,7 +171,7 @@ impl ClientCredentials {
171171
client_secret,
172172
} => request.form(&RequestWithClientCredentials {
173173
body: form,
174-
client_id,
174+
client_id: Some(client_id),
175175
client_secret: Some(client_secret),
176176
client_assertion: None,
177177
client_assertion_type: None,
@@ -195,7 +195,7 @@ impl ClientCredentials {
195195

196196
request.form(&RequestWithClientCredentials {
197197
body: form,
198-
client_id,
198+
client_id: None,
199199
client_secret: None,
200200
client_assertion: Some(jwt.as_str()),
201201
client_assertion_type: Some(JwtBearerClientAssertionType),
@@ -228,7 +228,7 @@ impl ClientCredentials {
228228

229229
request.form(&RequestWithClientCredentials {
230230
body: form,
231-
client_id,
231+
client_id: None,
232232
client_secret: None,
233233
client_assertion: Some(client_assertion.as_str()),
234234
client_assertion_type: Some(JwtBearerClientAssertionType),
@@ -260,7 +260,7 @@ impl ClientCredentials {
260260

261261
request.form(&RequestWithClientCredentials {
262262
body: form,
263-
client_id,
263+
client_id: Some(client_id),
264264
client_secret: Some(client_secret.as_str()),
265265
client_assertion: None,
266266
client_assertion_type: None,
@@ -359,7 +359,8 @@ struct RequestWithClientCredentials<'a, T> {
359359
#[serde(flatten)]
360360
body: T,
361361

362-
client_id: &'a str,
362+
#[serde(skip_serializing_if = "Option::is_none")]
363+
client_id: Option<&'a str>,
363364
#[serde(skip_serializing_if = "Option::is_none")]
364365
client_secret: Option<&'a str>,
365366
#[serde(skip_serializing_if = "Option::is_none")]

crates/oidc-client/tests/it/types/client_credentials.rs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -188,12 +188,8 @@ async fn pass_client_secret_jwt() {
188188
.and(move |req: &Request| {
189189
let query_pairs = form_urlencoded::parse(&req.body).collect::<HashMap<_, _>>();
190190

191-
if query_pairs
192-
.get("client_id")
193-
.filter(|s| *s == CLIENT_ID)
194-
.is_none()
195-
{
196-
println!("Wrong or missing client ID");
191+
if query_pairs.contains_key("client_id") {
192+
println!("`client_secret_jwt` client authentication should not use `client_id`");
197193
return false;
198194
}
199195
if query_pairs
@@ -271,12 +267,8 @@ async fn pass_private_key_jwt() {
271267
.and(move |req: &Request| {
272268
let query_pairs = form_urlencoded::parse(&req.body).collect::<HashMap<_, _>>();
273269

274-
if query_pairs
275-
.get("client_id")
276-
.filter(|s| *s == CLIENT_ID)
277-
.is_none()
278-
{
279-
println!("Wrong or missing client ID");
270+
if query_pairs.contains_key("client_id") {
271+
println!("`private_key_jwt` client authentication should not use `client_id`");
280272
return false;
281273
}
282274
if query_pairs

0 commit comments

Comments
 (0)