Skip to content

Commit 298ebc7

Browse files
ovidiupopa07jgrandja
authored andcommitted
Avoid client secret double encoding when updating a registered client
This might have to be revisited at a later point, but to check if a value is encoded or not is quite tricky. The decision was to remove client_secret and client_secret_expires_at from the update statement Closes gh-389
1 parent 0735abd commit 298ebc7

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/client/JdbcRegisteredClientRepository.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,7 @@ public class JdbcRegisteredClientRepository implements RegisteredClientRepositor
9595

9696
// @formatter:off
9797
private static final String UPDATE_REGISTERED_CLIENT_SQL = "UPDATE " + TABLE_NAME
98-
+ " SET client_secret = ?, client_secret_expires_at = ?,"
99-
+ " client_name = ?, client_authentication_methods = ?, authorization_grant_types = ?,"
98+
+ " SET client_name = ?, client_authentication_methods = ?, authorization_grant_types = ?,"
10099
+ " redirect_uris = ?, scopes = ?, client_settings = ?, token_settings = ?"
101100
+ " WHERE " + PK_FILTER;
102101
// @formatter:on
@@ -134,6 +133,8 @@ private void updateRegisteredClient(RegisteredClient registeredClient) {
134133
SqlParameterValue id = parameters.remove(0);
135134
parameters.remove(0); // remove client_id
136135
parameters.remove(0); // remove client_id_issued_at
136+
parameters.remove(0); // remove client_secret
137+
parameters.remove(0); // remove client_secret_expires_at
137138
parameters.add(id);
138139
PreparedStatementSetter pss = new ArgumentPreparedStatementSetter(parameters.toArray());
139140
this.jdbcOperations.update(UPDATE_REGISTERED_CLIENT_SQL, pss);

oauth2-authorization-server/src/test/java/org/springframework/security/oauth2/server/authorization/client/JdbcRegisteredClientRepositoryTests.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
4141
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
4242
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
43+
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
4344
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
4445
import org.springframework.security.crypto.password.PasswordEncoder;
4546
import org.springframework.security.jackson2.SecurityJackson2Modules;
@@ -57,6 +58,7 @@
5758
import static org.mockito.ArgumentMatchers.any;
5859
import static org.mockito.ArgumentMatchers.anyInt;
5960
import static org.mockito.ArgumentMatchers.anyString;
61+
import static org.mockito.ArgumentMatchers.eq;
6062
import static org.mockito.Mockito.spy;
6163
import static org.mockito.Mockito.verify;
6264
import static org.mockito.Mockito.verifyNoInteractions;
@@ -196,6 +198,29 @@ public void saveLoadRegisteredClientWhenCustomStrategiesSetThenCalled() throws E
196198
verify(this.passwordEncoder).encode(anyString());
197199
}
198200

201+
// gh-389
202+
@Test
203+
public void saveWhenClientSecretAlreadyEncodedThenNotUpdated() {
204+
PasswordEncoder passwordEncoder = spy(PasswordEncoderFactories.createDelegatingPasswordEncoder());
205+
RegisteredClientParametersMapper registeredClientParametersMapper = new RegisteredClientParametersMapper();
206+
registeredClientParametersMapper.setPasswordEncoder(passwordEncoder);
207+
this.registeredClientRepository.setRegisteredClientParametersMapper(registeredClientParametersMapper);
208+
209+
RegisteredClient originalRegisteredClient = TestRegisteredClients.registeredClient().build();
210+
this.registeredClientRepository.save(originalRegisteredClient);
211+
verify(passwordEncoder).encode(eq(originalRegisteredClient.getClientSecret()));
212+
213+
RegisteredClient registeredClient = this.registeredClientRepository.findById(originalRegisteredClient.getId());
214+
assertThat(registeredClient).isNotNull();
215+
assertThat(passwordEncoder.matches(originalRegisteredClient.getClientSecret(), registeredClient.getClientSecret())).isTrue();
216+
217+
RegisteredClient updatedRegisteredClient = RegisteredClient.from(registeredClient).clientSecret("updated-client-secret").build();
218+
this.registeredClientRepository.save(updatedRegisteredClient);
219+
updatedRegisteredClient = this.registeredClientRepository.findById(originalRegisteredClient.getId());
220+
assertThat(updatedRegisteredClient).isNotNull();
221+
assertThat(passwordEncoder.matches(originalRegisteredClient.getClientSecret(), updatedRegisteredClient.getClientSecret())).isTrue();
222+
}
223+
199224
@Test
200225
public void findByIdWhenIdNullThenThrowIllegalArgumentException() {
201226
// @formatter:off

0 commit comments

Comments
 (0)