| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 | 
							- = Authentication Changes
 
- == Opaque Token Credentials Will Be Encoded For You
 
- In order to comply more closely with the Introspection RFC, Spring Security's opaque token support will encode the client id and secret before creating the authorization header.
 
- This change means you will no longer have to encode the client id and secret yourself.
 
- If your client id or secret contain URL-unsafe characters, then you can prepare yourself for this change by doing the following:
 
- === Replace Usage of `introspectionClientCredentials`
 
- Since Spring Security can now do the encoding for you, replace xref:servlet/oauth2/resource-server/opaque-token.adoc#oauth2resourceserver-opaque-introspectionuri-dsl[using `introspectionClientCredentials`] with publishing the following `@Bean`:
 
- [tabs]
 
- ======
 
- Java::
 
- +
 
- [source,java,role="primary"]
 
- ----
 
- @Bean
 
- OpaqueTokenIntrospector introspector() {
 
- 	return SpringOpaqueTokenIntrospector.withIntrospectionUri(introspectionUri)
 
-             .clientId(unencodedClientId).clientSecret(unencodedClientSecret).build();
 
- }
 
- ----
 
- Kotlin::
 
- +
 
- [source,kotlin,role="secondary"]
 
- ----
 
- @Bean
 
- fun introspector(): OpaqueTokenIntrospector {
 
-     return SpringOpaqueTokenIntrospector.withIntrospectionUri(introspectionUri)
 
-             .clientId(unencodedClientId).clientSecret(unencodedClientSecret).build()
 
- }
 
- ----
 
- ======
 
- The above will be the default in 7.0.
 
- If this setting gives you trouble or you cannot apply it for now, you can use the `RestOperations` constructor instead:
 
- [tabs]
 
- ======
 
- Java::
 
- +
 
- [source,java,role="primary"]
 
- ----
 
- @Bean
 
- OpaqueTokenIntrospector introspector() {
 
- 	RestTemplate rest = new RestTemplate();
 
- 	rest.addInterceptor(new BasicAuthenticationInterceptor(encodedClientId, encodedClientSecret));
 
- 	return new SpringOpaqueTokenIntrospector(introspectionUri, rest);
 
- }
 
- ----
 
- Kotlin::
 
- +
 
- [source,kotlin,role="secondary"]
 
- ----
 
- @Bean
 
- fun introspector(): OpaqueTokenIntrospector {
 
- 	val rest = RestTemplate()
 
- 	rest.addInterceptor(BasicAuthenticationInterceptor(encodedClientId, encodedClientSecret))
 
- 	return SpringOpaqueTokenIntrospector(introspectionUri, rest)
 
- }
 
- ----
 
- ======
 
 
  |