Skip to content

Commit 326e4a1

Browse files
authored
fix: ensure both refreshMargin and expirationMargin are set when using OAuth2CredentialsWithRefresh (#1131)
* fix: Ensure both refreshMargin and expirationMargin are set when using OAuth2CredentialsWithRefresh * fix: review
1 parent f55d41f commit 326e4a1

File tree

3 files changed

+131
-2
lines changed

3 files changed

+131
-2
lines changed

oauth2_http/java/com/google/auth/oauth2/OAuth2Credentials.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,18 @@ public final AccessToken getAccessToken() {
151151
return null;
152152
}
153153

154+
/** Returns the credentials' refresh margin. */
155+
@VisibleForTesting
156+
Duration getRefreshMargin() {
157+
return this.refreshMargin;
158+
}
159+
160+
/** Returns the credentials' expiration margin. */
161+
@VisibleForTesting
162+
Duration getExpirationMargin() {
163+
return this.expirationMargin;
164+
}
165+
154166
@Override
155167
public void getRequestMetadata(
156168
final URI uri, Executor executor, final RequestMetadataCallback callback) {

oauth2_http/java/com/google/auth/oauth2/OAuth2CredentialsWithRefresh.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,16 @@ public interface OAuth2RefreshHandler {
4949

5050
private final OAuth2RefreshHandler refreshHandler;
5151

52+
protected OAuth2CredentialsWithRefresh(Builder builder) {
53+
super(builder.getAccessToken(), builder.getRefreshMargin(), builder.getExpirationMargin());
54+
// An expiration time must be provided.
55+
if (builder.getAccessToken() != null && builder.getAccessToken().getExpirationTime() == null) {
56+
throw new IllegalArgumentException(
57+
"The provided access token must contain the expiration time.");
58+
}
59+
this.refreshHandler = checkNotNull(builder.refreshHandler);
60+
}
61+
5262
protected OAuth2CredentialsWithRefresh(
5363
AccessToken accessToken, OAuth2RefreshHandler refreshHandler) {
5464
super(accessToken);
@@ -101,7 +111,7 @@ public Builder setRefreshHandler(OAuth2RefreshHandler handler) {
101111
}
102112

103113
public OAuth2CredentialsWithRefresh build() {
104-
return new OAuth2CredentialsWithRefresh(getAccessToken(), refreshHandler);
114+
return new OAuth2CredentialsWithRefresh(this);
105115
}
106116
}
107117
}

oauth2_http/javatests/com/google/auth/oauth2/OAuth2CredentialsWithRefreshTest.java

Lines changed: 108 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,26 @@
3131

3232
package com.google.auth.oauth2;
3333

34+
import static com.google.auth.oauth2.OAuth2Credentials.DEFAULT_EXPIRATION_MARGIN;
35+
import static com.google.auth.oauth2.OAuth2Credentials.DEFAULT_REFRESH_MARGIN;
3436
import static org.junit.Assert.assertEquals;
3537
import static org.junit.Assert.fail;
3638

39+
import com.google.auth.TestUtils;
3740
import java.io.IOException;
41+
import java.net.URI;
42+
import java.time.Duration;
43+
import java.time.temporal.ChronoUnit;
3844
import java.util.Date;
45+
import java.util.List;
46+
import java.util.Map;
3947
import org.junit.Test;
4048
import org.junit.runner.RunWith;
4149
import org.junit.runners.JUnit4;
4250

4351
/** Tests for {@link OAuth2CredentialsWithRefresh}. */
4452
@RunWith(JUnit4.class)
4553
public class OAuth2CredentialsWithRefreshTest {
46-
4754
private static final AccessToken ACCESS_TOKEN = new AccessToken("accessToken", new Date());
4855

4956
@Test
@@ -65,6 +72,85 @@ public AccessToken refreshAccessToken() {
6572
assertEquals(refreshHandler, credential.getRefreshHandler());
6673
}
6774

75+
@Test
76+
public void builder_withRefreshAndExpirationMargins() {
77+
OAuth2CredentialsWithRefresh.OAuth2RefreshHandler refreshHandler =
78+
new OAuth2CredentialsWithRefresh.OAuth2RefreshHandler() {
79+
@Override
80+
public AccessToken refreshAccessToken() {
81+
return null;
82+
}
83+
};
84+
85+
Duration refreshMargin = Duration.of(10, ChronoUnit.SECONDS);
86+
Duration expirationMargin = Duration.of(12, ChronoUnit.SECONDS);
87+
88+
OAuth2CredentialsWithRefresh credential =
89+
(OAuth2CredentialsWithRefresh)
90+
OAuth2CredentialsWithRefresh.newBuilder()
91+
.setAccessToken(ACCESS_TOKEN)
92+
.setRefreshHandler(refreshHandler)
93+
.setRefreshMargin(refreshMargin)
94+
.setExpirationMargin(expirationMargin)
95+
.build();
96+
97+
assertEquals(ACCESS_TOKEN, credential.getAccessToken());
98+
assertEquals(refreshMargin, credential.getRefreshMargin());
99+
assertEquals(expirationMargin, credential.getExpirationMargin());
100+
assertEquals(refreshHandler, credential.getRefreshHandler());
101+
}
102+
103+
@Test
104+
public void builder_onlyRefreshMarginSet() {
105+
OAuth2CredentialsWithRefresh.OAuth2RefreshHandler refreshHandler =
106+
new OAuth2CredentialsWithRefresh.OAuth2RefreshHandler() {
107+
@Override
108+
public AccessToken refreshAccessToken() {
109+
return null;
110+
}
111+
};
112+
113+
Duration refreshMargin = Duration.of(10, ChronoUnit.SECONDS);
114+
115+
OAuth2CredentialsWithRefresh credential =
116+
(OAuth2CredentialsWithRefresh)
117+
OAuth2CredentialsWithRefresh.newBuilder()
118+
.setAccessToken(ACCESS_TOKEN)
119+
.setRefreshHandler(refreshHandler)
120+
.setRefreshMargin(refreshMargin)
121+
.build();
122+
123+
assertEquals(ACCESS_TOKEN, credential.getAccessToken());
124+
assertEquals(refreshMargin, credential.getRefreshMargin());
125+
assertEquals(DEFAULT_EXPIRATION_MARGIN, credential.getExpirationMargin());
126+
assertEquals(refreshHandler, credential.getRefreshHandler());
127+
}
128+
129+
@Test
130+
public void builder_onlyExpirationMarginSet() {
131+
OAuth2CredentialsWithRefresh.OAuth2RefreshHandler refreshHandler =
132+
new OAuth2CredentialsWithRefresh.OAuth2RefreshHandler() {
133+
@Override
134+
public AccessToken refreshAccessToken() {
135+
return null;
136+
}
137+
};
138+
139+
Duration expirationMargin = Duration.of(12, ChronoUnit.SECONDS);
140+
OAuth2CredentialsWithRefresh credential =
141+
(OAuth2CredentialsWithRefresh)
142+
OAuth2CredentialsWithRefresh.newBuilder()
143+
.setAccessToken(ACCESS_TOKEN)
144+
.setRefreshHandler(refreshHandler)
145+
.setExpirationMargin(expirationMargin)
146+
.build();
147+
148+
assertEquals(ACCESS_TOKEN, credential.getAccessToken());
149+
assertEquals(DEFAULT_REFRESH_MARGIN, credential.getRefreshMargin());
150+
assertEquals(expirationMargin, credential.getExpirationMargin());
151+
assertEquals(refreshHandler, credential.getRefreshHandler());
152+
}
153+
68154
@Test
69155
public void builder_noAccessToken() {
70156
OAuth2CredentialsWithRefresh.newBuilder()
@@ -119,4 +205,25 @@ public AccessToken refreshAccessToken() {
119205

120206
assertEquals(refreshedToken, accessToken);
121207
}
208+
209+
@Test
210+
public void getRequestMetadata() throws IOException {
211+
URI uri = URI.create("http://googleapis.com/testapi/v1/foo");
212+
final AccessToken refreshedToken = new AccessToken("refreshedAccessToken", new Date());
213+
OAuth2CredentialsWithRefresh credentials =
214+
OAuth2CredentialsWithRefresh.newBuilder()
215+
.setAccessToken(ACCESS_TOKEN)
216+
.setRefreshHandler(
217+
new OAuth2CredentialsWithRefresh.OAuth2RefreshHandler() {
218+
@Override
219+
public AccessToken refreshAccessToken() {
220+
return refreshedToken;
221+
}
222+
})
223+
.build();
224+
225+
Map<String, List<String>> metadata = credentials.getRequestMetadata(uri);
226+
227+
TestUtils.assertContainsBearerToken(metadata, refreshedToken.getTokenValue());
228+
}
122229
}

0 commit comments

Comments
 (0)