@@ -30,6 +30,8 @@ public class OAuthAuthorizationCodeFlowLatestIT extends BaseWiremockTest {
3030 SCENARIOS_BASE_DIR + "/successful_flow.json" ;
3131 private static final String SUCCESSFUL_DPOP_FLOW_SCENARIO_MAPPINGS =
3232 SCENARIOS_BASE_DIR + "/successful_dpop_flow.json" ;
33+ private static final String SUCCESSFUL_FLOW_WITH_SINGLE_USE_REFRESH_TOKENS_SCENARIO_MAPPINGS =
34+ SCENARIOS_BASE_DIR + "/successful_flow_with_single_use_refresh_tokens.json" ;
3335 private static final String DPOP_NONCE_ERROR_SCENARIO_MAPPINGS =
3436 SCENARIOS_BASE_DIR + "/dpop_nonce_error_flow.json" ;
3537 private static final String BROWSER_TIMEOUT_SCENARIO_MAPPING =
@@ -59,7 +61,7 @@ public OAuthAuthorizationCodeFlowLatestIT() throws SFException {}
5961 public void successfulFlowScenario () throws SFException {
6062 importMappingFromResources (SUCCESSFUL_FLOW_SCENARIO_MAPPINGS );
6163 SFLoginInput loginInput =
62- createLoginInputStub ("http://localhost:8009/snowflake/oauth-redirect" , null , null );
64+ createLoginInputStub ("http://localhost:8009/snowflake/oauth-redirect" , null , null , false );
6365
6466 TokenResponseDTO tokenResponse = provider .getAccessToken (loginInput );
6567 String accessToken = tokenResponse .getAccessToken ();
@@ -96,14 +98,31 @@ public void successfulFlowDPoPScenarioWithNonce() throws SFException {
9698 Assertions .assertEquals ("access-token-123" , accessToken );
9799 }
98100
101+ @ Test
102+ public void successfulFlowWithSingleUseRefreshTokensScenario () throws SFException {
103+ importMappingFromResources (SUCCESSFUL_FLOW_WITH_SINGLE_USE_REFRESH_TOKENS_SCENARIO_MAPPINGS );
104+ SFLoginInput loginInput =
105+ createLoginInputStub ("http://localhost:8009/snowflake/oauth-redirect" , null , null , true );
106+
107+ TokenResponseDTO tokenResponse = provider .getAccessToken (loginInput );
108+ String accessToken = tokenResponse .getAccessToken ();
109+ String refreshToken = tokenResponse .getRefreshToken ();
110+
111+ Assertions .assertFalse (StringUtils .isNullOrEmpty (accessToken ));
112+ Assertions .assertFalse (StringUtils .isNullOrEmpty (refreshToken ));
113+ Assertions .assertEquals ("access-token-123" , accessToken );
114+ Assertions .assertEquals ("refresh-token-123" , refreshToken );
115+ }
116+
99117 @ Test
100118 public void customUrlsScenario () throws SFException {
101119 importMappingFromResources (CUSTOM_URLS_SCENARIO_MAPPINGS );
102120 SFLoginInput loginInput =
103121 createLoginInputStub (
104122 "http://localhost:8007/snowflake/oauth-redirect" ,
105123 String .format ("http://%s:%d/authorization" , WIREMOCK_HOST , wiremockHttpPort ),
106- String .format ("http://%s:%d/tokenrequest" , WIREMOCK_HOST , wiremockHttpPort ));
124+ String .format ("http://%s:%d/tokenrequest" , WIREMOCK_HOST , wiremockHttpPort ),
125+ false );
107126
108127 TokenResponseDTO tokenResponse = provider .getAccessToken (loginInput );
109128 String accessToken = tokenResponse .getAccessToken ();
@@ -116,7 +135,7 @@ public void customUrlsScenario() throws SFException {
116135 public void browserTimeoutFlowScenario () throws SFException {
117136 importMappingFromResources (BROWSER_TIMEOUT_SCENARIO_MAPPING );
118137 SFLoginInput loginInput =
119- createLoginInputStub ("http://localhost:8004/snowflake/oauth-redirect" , null , null );
138+ createLoginInputStub ("http://localhost:8004/snowflake/oauth-redirect" , null , null , false );
120139
121140 AccessTokenProvider provider =
122141 new OAuthAuthorizationCodeAccessTokenProvider (
@@ -133,7 +152,7 @@ public void browserTimeoutFlowScenario() throws SFException {
133152 public void invalidScopeFlowScenario () {
134153 importMappingFromResources (INVALID_SCOPE_SCENARIO_MAPPING );
135154 SFLoginInput loginInput =
136- createLoginInputStub ("http://localhost:8002/snowflake/oauth-redirect" , null , null );
155+ createLoginInputStub ("http://localhost:8002/snowflake/oauth-redirect" , null , null , false );
137156 SFException e =
138157 Assertions .assertThrows (SFException .class , () -> provider .getAccessToken (loginInput ));
139158 Assertions .assertTrue (
@@ -146,7 +165,7 @@ public void invalidScopeFlowScenario() {
146165 public void invalidStateFlowScenario () {
147166 importMappingFromResources (INVALID_STATE_SCENARIO_MAPPING );
148167 SFLoginInput loginInput =
149- createLoginInputStub ("http://localhost:8010/snowflake/oauth-redirect" , null , null );
168+ createLoginInputStub ("http://localhost:8010/snowflake/oauth-redirect" , null , null , false );
150169 SFException e =
151170 Assertions .assertThrows (SFException .class , () -> provider .getAccessToken (loginInput ));
152171 Assertions .assertTrue (
@@ -159,7 +178,7 @@ public void invalidStateFlowScenario() {
159178 public void tokenRequestErrorFlowScenario () {
160179 importMappingFromResources (TOKEN_REQUEST_ERROR_SCENARIO_MAPPING );
161180 SFLoginInput loginInput =
162- createLoginInputStub ("http://localhost:8003/snowflake/oauth-redirect" , null , null );
181+ createLoginInputStub ("http://localhost:8003/snowflake/oauth-redirect" , null , null , false );
163182
164183 SFException e =
165184 Assertions .assertThrows (SFException .class , () -> provider .getAccessToken (loginInput ));
@@ -169,12 +188,21 @@ public void tokenRequestErrorFlowScenario() {
169188 }
170189
171190 private SFLoginInput createLoginInputStub (
172- String redirectUri , String authorizationUrl , String tokenRequestUrl ) {
191+ String redirectUri ,
192+ String authorizationUrl ,
193+ String tokenRequestUrl ,
194+ boolean enableSingleUseRefreshTokens ) {
173195 SFLoginInput loginInputStub = new SFLoginInput ();
174196 loginInputStub .setServerUrl (String .format ("http://%s:%d/" , WIREMOCK_HOST , wiremockHttpPort ));
175197 loginInputStub .setOauthLoginInput (
176198 new SFOauthLoginInput (
177- "123" , "123" , redirectUri , authorizationUrl , tokenRequestUrl , "session:role:ANALYST" ));
199+ "123" ,
200+ "123" ,
201+ redirectUri ,
202+ authorizationUrl ,
203+ tokenRequestUrl ,
204+ "session:role:ANALYST" ,
205+ enableSingleUseRefreshTokens ));
178206 loginInputStub .setSocketTimeout (Duration .ofMinutes (5 ));
179207 loginInputStub .setHttpClientSettingsKey (new HttpClientSettingsKey (OCSPMode .FAIL_OPEN ));
180208
@@ -184,7 +212,7 @@ private SFLoginInput createLoginInputStub(
184212 private SFLoginInput createLoginInputStubWithDPoPEnabled (
185213 String redirectUri , String authorizationUrl , String tokenRequestUrl ) {
186214 SFLoginInput loginInputStub =
187- createLoginInputStub (redirectUri , authorizationUrl , tokenRequestUrl );
215+ createLoginInputStub (redirectUri , authorizationUrl , tokenRequestUrl , false );
188216 loginInputStub .setDPoPEnabled (true );
189217 return loginInputStub ;
190218 }
0 commit comments