mirror of
				https://github.com/spring-projects/spring-security.git
				synced 2025-11-04 08:39:05 +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)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								----
							 | 
						||
| 
								 | 
							
								======
							 |