mirror of
				https://github.com/spring-projects/spring-security.git
				synced 2025-10-31 22:58:58 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			69 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| = 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)
 | |
| }
 | |
| ----
 | |
| ======
 |