@ -54,6 +54,9 @@ import org.springframework.security.core.GrantedAuthority;
@@ -54,6 +54,9 @@ import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.crypto.password.NoOpPasswordEncoder ;
import org.springframework.security.crypto.password.PasswordEncoder ;
import org.springframework.security.oauth2.core.AuthorizationGrantType ;
import org.springframework.security.oauth2.core.OAuth2AccessToken ;
import org.springframework.security.oauth2.core.OAuth2Token ;
import org.springframework.security.oauth2.core.OAuth2TokenType ;
import org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse ;
import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames ;
import org.springframework.security.oauth2.core.http.converter.OAuth2AccessTokenResponseHttpMessageConverter ;
@ -93,6 +96,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@@ -93,6 +96,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
* /
public class OAuth2RefreshTokenGrantTests {
private static final String DEFAULT_TOKEN_ENDPOINT_URI = "/oauth2/token" ;
private static final String DEFAULT_TOKEN_REVOCATION_ENDPOINT_URI = "/oauth2/revoke" ;
private static final String AUTHORITIES_CLAIM = "authorities" ;
private static EmbeddedDatabase db ;
private static JWKSource < SecurityContext > jwkSource ;
@ -181,6 +185,37 @@ public class OAuth2RefreshTokenGrantTests {
@@ -181,6 +185,37 @@ public class OAuth2RefreshTokenGrantTests {
assertThat ( authoritiesClaim ) . containsExactlyInAnyOrderElementsOf ( userAuthorities ) ;
}
// gh-432
@Test
public void requestWhenRevokeAndRefreshThenAccessTokenActive ( ) throws Exception {
this . spring . register ( AuthorizationServerConfiguration . class ) . autowire ( ) ;
RegisteredClient registeredClient = TestRegisteredClients . registeredClient ( ) . build ( ) ;
this . registeredClientRepository . save ( registeredClient ) ;
OAuth2Authorization authorization = TestOAuth2Authorizations . authorization ( registeredClient ) . build ( ) ;
this . authorizationService . save ( authorization ) ;
OAuth2AccessToken token = authorization . getAccessToken ( ) . getToken ( ) ;
OAuth2TokenType tokenType = OAuth2TokenType . ACCESS_TOKEN ;
this . mvc . perform ( post ( DEFAULT_TOKEN_REVOCATION_ENDPOINT_URI )
. params ( getTokenRevocationRequestParameters ( token , tokenType ) )
. header ( HttpHeaders . AUTHORIZATION , "Basic " + encodeBasicAuth (
registeredClient . getClientId ( ) , registeredClient . getClientSecret ( ) ) ) )
. andExpect ( status ( ) . isOk ( ) ) ;
this . mvc . perform ( post ( DEFAULT_TOKEN_ENDPOINT_URI )
. params ( getRefreshTokenRequestParameters ( authorization ) )
. header ( HttpHeaders . AUTHORIZATION , "Basic " + encodeBasicAuth (
registeredClient . getClientId ( ) , registeredClient . getClientSecret ( ) ) ) )
. andExpect ( status ( ) . isOk ( ) ) ;
OAuth2Authorization updatedAuthorization = this . authorizationService . findById ( authorization . getId ( ) ) ;
OAuth2Authorization . Token < OAuth2AccessToken > accessToken = updatedAuthorization . getAccessToken ( ) ;
assertThat ( accessToken . isActive ( ) ) . isTrue ( ) ;
}
private static MultiValueMap < String , String > getRefreshTokenRequestParameters ( OAuth2Authorization authorization ) {
MultiValueMap < String , String > parameters = new LinkedMultiValueMap < > ( ) ;
parameters . set ( OAuth2ParameterNames . GRANT_TYPE , AuthorizationGrantType . REFRESH_TOKEN . getValue ( ) ) ;
@ -188,6 +223,13 @@ public class OAuth2RefreshTokenGrantTests {
@@ -188,6 +223,13 @@ public class OAuth2RefreshTokenGrantTests {
return parameters ;
}
private static MultiValueMap < String , String > getTokenRevocationRequestParameters ( OAuth2Token token , OAuth2TokenType tokenType ) {
MultiValueMap < String , String > parameters = new LinkedMultiValueMap < > ( ) ;
parameters . set ( OAuth2ParameterNames . TOKEN , token . getTokenValue ( ) ) ;
parameters . set ( OAuth2ParameterNames . TOKEN_TYPE_HINT , tokenType . getValue ( ) ) ;
return parameters ;
}
private static String encodeBasicAuth ( String clientId , String secret ) throws Exception {
clientId = URLEncoder . encode ( clientId , StandardCharsets . UTF_8 . name ( ) ) ;
secret = URLEncoder . encode ( secret , StandardCharsets . UTF_8 . name ( ) ) ;