Skip to content

Commit 430f9a8

Browse files
authored
chore: Support for specifying query parameters in HttpRequestInfo (#463)
* chore: Support for specifying query parameters in HttpRequestInfo * fix: Removing redundant JsonObjectParser from HttpClient
1 parent 25f57e5 commit 430f9a8

File tree

10 files changed

+110
-135
lines changed

10 files changed

+110
-135
lines changed

src/main/java/com/google/firebase/auth/AbstractFirebaseAuth.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,7 @@ public FirebaseTokenVerifier get() {
9696
new Supplier<FirebaseUserManager>() {
9797
@Override
9898
public FirebaseUserManager get() {
99-
return FirebaseUserManager
100-
.builder()
101-
.setFirebaseApp(app)
102-
.setTenantId(tenantId)
103-
.build();
99+
return FirebaseUserManager.createUserManager(app, tenantId);
104100
}
105101
});
106102
}

src/main/java/com/google/firebase/auth/FirebaseAuth.java

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,12 @@
1919
import static com.google.common.base.Preconditions.checkArgument;
2020
import static com.google.common.base.Preconditions.checkNotNull;
2121

22-
import com.google.api.client.util.Clock;
2322
import com.google.api.core.ApiFuture;
2423
import com.google.common.annotations.VisibleForTesting;
2524
import com.google.common.base.Strings;
2625
import com.google.common.base.Supplier;
2726
import com.google.firebase.FirebaseApp;
2827
import com.google.firebase.ImplFirebaseTrampolines;
29-
import com.google.firebase.auth.internal.FirebaseTokenFactory;
3028
import com.google.firebase.auth.multitenancy.TenantManager;
3129
import com.google.firebase.internal.CallableOperation;
3230
import com.google.firebase.internal.FirebaseService;
@@ -214,37 +212,7 @@ FirebaseTokenVerifier getSessionCookieVerifier(boolean checkRevoked) {
214212
protected void doDestroy() { }
215213

216214
private static FirebaseAuth fromApp(final FirebaseApp app) {
217-
return new FirebaseAuth(
218-
AbstractFirebaseAuth.builder()
219-
.setFirebaseApp(app)
220-
.setTokenFactory(
221-
new Supplier<FirebaseTokenFactory>() {
222-
@Override
223-
public FirebaseTokenFactory get() {
224-
return FirebaseTokenUtils.createTokenFactory(app, Clock.SYSTEM);
225-
}
226-
})
227-
.setIdTokenVerifier(
228-
new Supplier<FirebaseTokenVerifier>() {
229-
@Override
230-
public FirebaseTokenVerifier get() {
231-
return FirebaseTokenUtils.createIdTokenVerifier(app, Clock.SYSTEM);
232-
}
233-
})
234-
.setCookieVerifier(
235-
new Supplier<FirebaseTokenVerifier>() {
236-
@Override
237-
public FirebaseTokenVerifier get() {
238-
return FirebaseTokenUtils.createSessionCookieVerifier(app, Clock.SYSTEM);
239-
}
240-
})
241-
.setUserManager(
242-
new Supplier<FirebaseUserManager>() {
243-
@Override
244-
public FirebaseUserManager get() {
245-
return FirebaseUserManager.builder().setFirebaseApp(app).build();
246-
}
247-
}));
215+
return new FirebaseAuth(AbstractFirebaseAuth.builderFromAppAndTenantId(app, null));
248216
}
249217

250218
private static class FirebaseAuthService extends FirebaseService<FirebaseAuth> {

src/main/java/com/google/firebase/auth/FirebaseUserManager.java

Lines changed: 66 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919
import static com.google.common.base.Preconditions.checkArgument;
2020
import static com.google.common.base.Preconditions.checkNotNull;
2121

22-
import com.google.api.client.http.GenericUrl;
23-
import com.google.api.client.http.HttpMethods;
2422
import com.google.api.client.http.HttpRequestFactory;
2523
import com.google.api.client.http.HttpResponseInterceptor;
2624
import com.google.api.client.json.GenericJson;
@@ -44,9 +42,9 @@
4442
import com.google.firebase.auth.internal.ListSamlProviderConfigsResponse;
4543
import com.google.firebase.auth.internal.UploadAccountResponse;
4644
import com.google.firebase.internal.ApiClientUtils;
45+
import com.google.firebase.internal.HttpRequestInfo;
4746
import com.google.firebase.internal.NonNull;
4847
import com.google.firebase.internal.Nullable;
49-
5048
import java.util.Collection;
5149
import java.util.HashSet;
5250
import java.util.List;
@@ -60,7 +58,7 @@
6058
* @see <a href="https://developers.google.com/identity/toolkit/web/reference/relyingparty">
6159
* Google Identity Toolkit</a>
6260
*/
63-
class FirebaseUserManager {
61+
final class FirebaseUserManager {
6462

6563
static final int MAX_LIST_PROVIDER_CONFIGS_RESULTS = 100;
6664
static final int MAX_GET_ACCOUNTS_BATCH_SIZE = 100;
@@ -81,13 +79,12 @@ class FirebaseUserManager {
8179
private final AuthHttpClient httpClient;
8280

8381
private FirebaseUserManager(Builder builder) {
84-
FirebaseApp app = checkNotNull(builder.app, "FirebaseApp must not be null");
85-
String projectId = ImplFirebaseTrampolines.getProjectId(app);
82+
String projectId = builder.projectId;
8683
checkArgument(!Strings.isNullOrEmpty(projectId),
8784
"Project ID is required to access the auth service. Use a service account credential or "
8885
+ "set the project ID explicitly via FirebaseOptions. Alternatively you can also "
8986
+ "set the project ID via the GOOGLE_CLOUD_PROJECT environment variable.");
90-
this.jsonFactory = app.getOptions().getJsonFactory();
87+
this.jsonFactory = checkNotNull(builder.jsonFactory, "JsonFactory must not be null");
9188
final String idToolkitUrlV1 = String.format(ID_TOOLKIT_URL, "v1", projectId);
9289
final String idToolkitUrlV2 = String.format(ID_TOOLKIT_URL, "v2", projectId);
9390
final String tenantId = builder.tenantId;
@@ -100,9 +97,7 @@ private FirebaseUserManager(Builder builder) {
10097
this.idpConfigMgtBaseUrl = idToolkitUrlV2 + "/tenants/" + tenantId;
10198
}
10299

103-
HttpRequestFactory requestFactory = builder.requestFactory == null
104-
? ApiClientUtils.newAuthorizedRequestFactory(app) : builder.requestFactory;
105-
this.httpClient = new AuthHttpClient(jsonFactory, requestFactory);
100+
this.httpClient = new AuthHttpClient(jsonFactory, builder.requestFactory);
106101
}
107102

108103
@VisibleForTesting
@@ -182,9 +177,10 @@ DownloadAccountResponse listUsers(int maxResults, String pageToken) throws Fireb
182177
builder.put("nextPageToken", pageToken);
183178
}
184179

185-
GenericUrl url = new GenericUrl(userMgtBaseUrl + "/accounts:batchGet");
186-
url.putAll(builder.build());
187-
return httpClient.sendRequest(HttpMethods.GET, url, null, DownloadAccountResponse.class);
180+
String url = userMgtBaseUrl + "/accounts:batchGet";
181+
HttpRequestInfo requestInfo = HttpRequestInfo.buildGetRequest(url)
182+
.addAllParameters(builder.build());
183+
return httpClient.sendRequest(requestInfo, DownloadAccountResponse.class);
188184
}
189185

190186
UserImportResult importUsers(UserImportRequest request) throws FirebaseAuthException {
@@ -218,8 +214,9 @@ String getEmailActionLink(EmailLinkType type, String email,
218214

219215
private UserRecord lookupUserAccount(
220216
Map<String, Object> payload, String identifier) throws FirebaseAuthException {
221-
IncomingHttpResponse response = httpClient.sendRequest(
222-
HttpMethods.POST, new GenericUrl(userMgtBaseUrl + "/accounts:lookup"), payload);
217+
HttpRequestInfo requestInfo = HttpRequestInfo.buildJsonPostRequest(
218+
userMgtBaseUrl + "/accounts:lookup", payload);
219+
IncomingHttpResponse response = httpClient.sendRequest(requestInfo);
223220
GetAccountInfoResponse parsed = httpClient.parse(response, GetAccountInfoResponse.class);
224221
if (parsed.getUsers() == null || parsed.getUsers().isEmpty()) {
225222
throw new FirebaseAuthException(ErrorCode.NOT_FOUND,
@@ -234,44 +231,46 @@ private UserRecord lookupUserAccount(
234231

235232
OidcProviderConfig createOidcProviderConfig(
236233
OidcProviderConfig.CreateRequest request) throws FirebaseAuthException {
237-
GenericUrl url = new GenericUrl(idpConfigMgtBaseUrl + "/oauthIdpConfigs");
238-
url.set("oauthIdpConfigId", request.getProviderId());
239-
return httpClient.sendRequest("POST", url, request.getProperties(), OidcProviderConfig.class);
234+
String url = idpConfigMgtBaseUrl + "/oauthIdpConfigs";
235+
HttpRequestInfo requestInfo = HttpRequestInfo.buildJsonPostRequest(url, request.getProperties())
236+
.addParameter("oauthIdpConfigId", request.getProviderId());
237+
return httpClient.sendRequest(requestInfo, OidcProviderConfig.class);
240238
}
241239

242240
SamlProviderConfig createSamlProviderConfig(
243241
SamlProviderConfig.CreateRequest request) throws FirebaseAuthException {
244-
GenericUrl url = new GenericUrl(idpConfigMgtBaseUrl + "/inboundSamlConfigs");
245-
url.set("inboundSamlConfigId", request.getProviderId());
246-
return httpClient.sendRequest("POST", url, request.getProperties(), SamlProviderConfig.class);
242+
String url = idpConfigMgtBaseUrl + "/inboundSamlConfigs";
243+
HttpRequestInfo requestInfo = HttpRequestInfo.buildJsonPostRequest(url, request.getProperties())
244+
.addParameter("inboundSamlConfigId", request.getProviderId());
245+
return httpClient.sendRequest(requestInfo, SamlProviderConfig.class);
247246
}
248247

249248
OidcProviderConfig updateOidcProviderConfig(OidcProviderConfig.UpdateRequest request)
250249
throws FirebaseAuthException {
251250
Map<String, Object> properties = request.getProperties();
252-
GenericUrl url =
253-
new GenericUrl(idpConfigMgtBaseUrl + getOidcUrlSuffix(request.getProviderId()));
254-
url.put("updateMask", Joiner.on(",").join(AuthHttpClient.generateMask(properties)));
255-
return httpClient.sendRequest("PATCH", url, properties, OidcProviderConfig.class);
251+
String url = idpConfigMgtBaseUrl + getOidcUrlSuffix(request.getProviderId());
252+
HttpRequestInfo requestInfo = HttpRequestInfo.buildJsonPatchRequest(url, properties)
253+
.addParameter("updateMask", Joiner.on(",").join(AuthHttpClient.generateMask(properties)));
254+
return httpClient.sendRequest(requestInfo, OidcProviderConfig.class);
256255
}
257256

258257
SamlProviderConfig updateSamlProviderConfig(SamlProviderConfig.UpdateRequest request)
259258
throws FirebaseAuthException {
260259
Map<String, Object> properties = request.getProperties();
261-
GenericUrl url =
262-
new GenericUrl(idpConfigMgtBaseUrl + getSamlUrlSuffix(request.getProviderId()));
263-
url.put("updateMask", Joiner.on(",").join(AuthHttpClient.generateMask(properties)));
264-
return httpClient.sendRequest("PATCH", url, properties, SamlProviderConfig.class);
260+
String url = idpConfigMgtBaseUrl + getSamlUrlSuffix(request.getProviderId());
261+
HttpRequestInfo requestInfo = HttpRequestInfo.buildJsonPatchRequest(url, properties)
262+
.addParameter("updateMask", Joiner.on(",").join(AuthHttpClient.generateMask(properties)));
263+
return httpClient.sendRequest(requestInfo, SamlProviderConfig.class);
265264
}
266265

267266
OidcProviderConfig getOidcProviderConfig(String providerId) throws FirebaseAuthException {
268-
GenericUrl url = new GenericUrl(idpConfigMgtBaseUrl + getOidcUrlSuffix(providerId));
269-
return httpClient.sendRequest("GET", url, null, OidcProviderConfig.class);
267+
String url = idpConfigMgtBaseUrl + getOidcUrlSuffix(providerId);
268+
return httpClient.sendRequest(HttpRequestInfo.buildGetRequest(url), OidcProviderConfig.class);
270269
}
271270

272271
SamlProviderConfig getSamlProviderConfig(String providerId) throws FirebaseAuthException {
273-
GenericUrl url = new GenericUrl(idpConfigMgtBaseUrl + getSamlUrlSuffix(providerId));
274-
return httpClient.sendRequest("GET", url, null, SamlProviderConfig.class);
272+
String url = idpConfigMgtBaseUrl + getSamlUrlSuffix(providerId);
273+
return httpClient.sendRequest(HttpRequestInfo.buildGetRequest(url), SamlProviderConfig.class);
275274
}
276275

277276
ListOidcProviderConfigsResponse listOidcProviderConfigs(int maxResults, String pageToken)
@@ -284,9 +283,10 @@ ListOidcProviderConfigsResponse listOidcProviderConfigs(int maxResults, String p
284283
builder.put("nextPageToken", pageToken);
285284
}
286285

287-
GenericUrl url = new GenericUrl(idpConfigMgtBaseUrl + "/oauthIdpConfigs");
288-
url.putAll(builder.build());
289-
return httpClient.sendRequest("GET", url, null, ListOidcProviderConfigsResponse.class);
286+
String url = idpConfigMgtBaseUrl + "/oauthIdpConfigs";
287+
HttpRequestInfo requestInfo = HttpRequestInfo.buildGetRequest(url)
288+
.addAllParameters(builder.build());
289+
return httpClient.sendRequest(requestInfo, ListOidcProviderConfigsResponse.class);
290290
}
291291

292292
ListSamlProviderConfigsResponse listSamlProviderConfigs(int maxResults, String pageToken)
@@ -299,19 +299,20 @@ ListSamlProviderConfigsResponse listSamlProviderConfigs(int maxResults, String p
299299
builder.put("nextPageToken", pageToken);
300300
}
301301

302-
GenericUrl url = new GenericUrl(idpConfigMgtBaseUrl + "/inboundSamlConfigs");
303-
url.putAll(builder.build());
304-
return httpClient.sendRequest("GET", url, null, ListSamlProviderConfigsResponse.class);
302+
String url = idpConfigMgtBaseUrl + "/inboundSamlConfigs";
303+
HttpRequestInfo requestInfo = HttpRequestInfo.buildGetRequest(url)
304+
.addAllParameters(builder.build());
305+
return httpClient.sendRequest(requestInfo, ListSamlProviderConfigsResponse.class);
305306
}
306307

307308
void deleteOidcProviderConfig(String providerId) throws FirebaseAuthException {
308-
GenericUrl url = new GenericUrl(idpConfigMgtBaseUrl + getOidcUrlSuffix(providerId));
309-
httpClient.sendRequest("DELETE", url, null, GenericJson.class);
309+
String url = idpConfigMgtBaseUrl + getOidcUrlSuffix(providerId);
310+
httpClient.sendRequest(HttpRequestInfo.buildDeleteRequest(url));
310311
}
311312

312313
void deleteSamlProviderConfig(String providerId) throws FirebaseAuthException {
313-
GenericUrl url = new GenericUrl(idpConfigMgtBaseUrl + getSamlUrlSuffix(providerId));
314-
httpClient.sendRequest("DELETE", url, null, GenericJson.class);
314+
String url = idpConfigMgtBaseUrl + getSamlUrlSuffix(providerId);
315+
httpClient.sendRequest(HttpRequestInfo.buildDeleteRequest(url));
315316
}
316317

317318
private static String getOidcUrlSuffix(String providerId) {
@@ -327,8 +328,8 @@ private static String getSamlUrlSuffix(String providerId) {
327328
private <T> T post(String path, Object content, Class<T> clazz) throws FirebaseAuthException {
328329
checkArgument(!Strings.isNullOrEmpty(path), "path must not be null or empty");
329330
checkNotNull(content, "content must not be null for POST requests");
330-
GenericUrl url = new GenericUrl(userMgtBaseUrl + path);
331-
return httpClient.sendRequest(HttpMethods.POST, url, content, clazz);
331+
String url = userMgtBaseUrl + path;
332+
return httpClient.sendRequest(HttpRequestInfo.buildJsonPostRequest(url, content), clazz);
332333
}
333334

334335
static class UserImportRequest extends GenericJson {
@@ -371,18 +372,30 @@ enum EmailLinkType {
371372
PASSWORD_RESET,
372373
}
373374

375+
static FirebaseUserManager createUserManager(FirebaseApp app, String tenantId) {
376+
return FirebaseUserManager.builder()
377+
.setProjectId(ImplFirebaseTrampolines.getProjectId(app))
378+
.setTenantId(tenantId)
379+
.setHttpRequestFactory(ApiClientUtils.newAuthorizedRequestFactory(app))
380+
.setJsonFactory(app.getOptions().getJsonFactory())
381+
.build();
382+
}
383+
374384
static Builder builder() {
375385
return new Builder();
376386
}
377387

378388
static class Builder {
379389

380-
private FirebaseApp app;
390+
private String projectId;
381391
private String tenantId;
382392
private HttpRequestFactory requestFactory;
393+
private JsonFactory jsonFactory;
394+
395+
private Builder() { }
383396

384-
Builder setFirebaseApp(FirebaseApp app) {
385-
this.app = app;
397+
public Builder setProjectId(String projectId) {
398+
this.projectId = projectId;
386399
return this;
387400
}
388401

@@ -396,6 +409,11 @@ Builder setHttpRequestFactory(HttpRequestFactory requestFactory) {
396409
return this;
397410
}
398411

412+
public Builder setJsonFactory(JsonFactory jsonFactory) {
413+
this.jsonFactory = jsonFactory;
414+
return this;
415+
}
416+
399417
FirebaseUserManager build() {
400418
return new FirebaseUserManager(this);
401419
}

src/main/java/com/google/firebase/auth/internal/AuthHttpClient.java

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package com.google.firebase.auth.internal;
1818

19-
import com.google.api.client.http.GenericUrl;
2019
import com.google.api.client.http.HttpRequestFactory;
2120
import com.google.api.client.http.HttpResponseInterceptor;
2221
import com.google.api.client.json.JsonFactory;
@@ -25,7 +24,6 @@
2524
import com.google.firebase.auth.FirebaseAuthException;
2625
import com.google.firebase.internal.ErrorHandlingHttpClient;
2726
import com.google.firebase.internal.HttpRequestInfo;
28-
import com.google.firebase.internal.Nullable;
2927
import com.google.firebase.internal.SdkUtils;
3028
import java.util.Map;
3129
import java.util.Set;
@@ -67,21 +65,14 @@ public void setInterceptor(HttpResponseInterceptor interceptor) {
6765
this.httpClient.setInterceptor(interceptor);
6866
}
6967

70-
public IncomingHttpResponse sendRequest(
71-
String method, GenericUrl url, @Nullable Object content) throws FirebaseAuthException {
72-
HttpRequestInfo request = HttpRequestInfo.buildJsonRequest(method, url, content)
73-
.addHeader(CLIENT_VERSION_HEADER, CLIENT_VERSION);
74-
return httpClient.send(request);
68+
public <T> T sendRequest(HttpRequestInfo request, Class<T> clazz) throws FirebaseAuthException {
69+
IncomingHttpResponse response = this.sendRequest(request);
70+
return this.parse(response, clazz);
7571
}
7672

77-
public <T> T sendRequest(
78-
String method,
79-
GenericUrl url,
80-
@Nullable Object content,
81-
Class<T> clazz) throws FirebaseAuthException {
82-
83-
IncomingHttpResponse response = this.sendRequest(method, url, content);
84-
return this.parse(response, clazz);
73+
public IncomingHttpResponse sendRequest(HttpRequestInfo request) throws FirebaseAuthException {
74+
request.addHeader(CLIENT_VERSION_HEADER, CLIENT_VERSION);
75+
return httpClient.send(request);
8576
}
8677

8778
public <T> T parse(IncomingHttpResponse response, Class<T> clazz) throws FirebaseAuthException {

0 commit comments

Comments
 (0)