Skip to content

Commit 7ab9c52

Browse files
authored
Using the new internal.HTTPClient APIs in auth (#272)
* Auth package migrated to DoAndUnmarshal * Updated tests * Rebased to dev
1 parent 11b2485 commit 7ab9c52

File tree

8 files changed

+150
-188
lines changed

8 files changed

+150
-188
lines changed

auth/auth.go

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ func NewClient(ctx context.Context, conf *internal.AuthConfig) (*Client, error)
8282
}
8383
}
8484

85-
hc, _, err := internal.NewHTTPClient(ctx, conf.Opts...)
85+
userMgt, err := newUserManagementClient(ctx, conf)
8686
if err != nil {
8787
return nil, err
8888
}
@@ -97,18 +97,12 @@ func NewClient(ctx context.Context, conf *internal.AuthConfig) (*Client, error)
9797
return nil, err
9898
}
9999

100-
version := "Go/Admin/" + conf.Version
101100
return &Client{
102-
userManagementClient: userManagementClient{
103-
baseURL: idToolkitEndpoint,
104-
projectID: conf.ProjectID,
105-
version: version,
106-
httpClient: hc,
107-
},
108-
idTokenVerifier: idTokenVerifier,
109-
cookieVerifier: cookieVerifier,
110-
signer: signer,
111-
clock: internal.SystemClock,
101+
userManagementClient: *userMgt,
102+
idTokenVerifier: idTokenVerifier,
103+
cookieVerifier: cookieVerifier,
104+
signer: signer,
105+
clock: internal.SystemClock,
112106
}, nil
113107
}
114108

auth/auth_test.go

Lines changed: 59 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"fmt"
2222
"io/ioutil"
2323
"log"
24+
"net/http"
2425
"os"
2526
"strings"
2627
"testing"
@@ -32,6 +33,11 @@ import (
3233
"google.golang.org/api/transport"
3334
)
3435

36+
const (
37+
testProjectID = "mock-project-id"
38+
testVersion = "test-version"
39+
)
40+
3541
var (
3642
testGetUserResponse []byte
3743
testIDToken string
@@ -48,31 +54,22 @@ var (
4854
AccessToken: "test.token",
4955
}),
5056
}
51-
testClock = &internal.MockClock{Timestamp: time.Now()}
52-
testProjectID = "mock-project-id"
57+
testClock = &internal.MockClock{Timestamp: time.Now()}
5358
)
5459

5560
func TestMain(m *testing.M) {
5661
var err error
5762
testSigner, err = signerForTests(context.Background())
58-
if err != nil {
59-
log.Fatalln(err)
60-
}
63+
logFatal(err)
6164

6265
testIDTokenVerifier, err = idTokenVerifierForTests(context.Background())
63-
if err != nil {
64-
log.Fatalln(err)
65-
}
66+
logFatal(err)
6667

6768
testCookieVerifier, err = cookieVerifierForTests(context.Background())
68-
if err != nil {
69-
log.Fatalln(err)
70-
}
69+
logFatal(err)
7170

7271
testGetUserResponse, err = ioutil.ReadFile("../testdata/get_user.json")
73-
if err != nil {
74-
log.Fatalln(err)
75-
}
72+
logFatal(err)
7673

7774
testIDToken = getIDToken(nil)
7875
testSessionCookie = getSessionCookie(nil)
@@ -88,7 +85,7 @@ func TestNewClientWithServiceAccountCredentials(t *testing.T) {
8885
Creds: creds,
8986
Opts: optsWithServiceAcct,
9087
ProjectID: creds.ProjectID,
91-
Version: "test-version",
88+
Version: testVersion,
9289
})
9390
if err != nil {
9491
t.Fatal(err)
@@ -103,19 +100,18 @@ func TestNewClientWithServiceAccountCredentials(t *testing.T) {
103100
if err := checkCookieVerifier(client.cookieVerifier, creds.ProjectID); err != nil {
104101
t.Errorf("NewClient().cookieVerifier: %v", err)
105102
}
103+
if err := checkUserManagementClient(client, creds.ProjectID); err != nil {
104+
t.Errorf("NewClient().userManagementClient: %v", err)
105+
}
106106
if client.clock != internal.SystemClock {
107107
t.Errorf("NewClient().clock = %v; want = SystemClock", client.clock)
108108
}
109-
wantVersion := "Go/Admin/test-version"
110-
if client.version != wantVersion {
111-
t.Errorf("NewClient().version = %q; want = %q", client.version, wantVersion)
112-
}
113109
}
114110

115111
func TestNewClientWithoutCredentials(t *testing.T) {
116112
conf := &internal.AuthConfig{
117113
Opts: optsWithTokenSource,
118-
Version: "test-version",
114+
Version: testVersion,
119115
}
120116
client, err := NewClient(context.Background(), conf)
121117
if err != nil {
@@ -131,20 +127,19 @@ func TestNewClientWithoutCredentials(t *testing.T) {
131127
if err := checkCookieVerifier(client.cookieVerifier, ""); err != nil {
132128
t.Errorf("NewClient().cookieVerifier: %v", err)
133129
}
130+
if err := checkUserManagementClient(client, ""); err != nil {
131+
t.Errorf("NewClient().userManagementClient: %v", err)
132+
}
134133
if client.clock != internal.SystemClock {
135134
t.Errorf("NewClient().clock = %v; want = SystemClock", client.clock)
136135
}
137-
wantVersion := "Go/Admin/test-version"
138-
if client.version != wantVersion {
139-
t.Errorf("NewClient().version = %q; want = %q", client.version, wantVersion)
140-
}
141136
}
142137

143138
func TestNewClientWithServiceAccountID(t *testing.T) {
144139
conf := &internal.AuthConfig{
145140
Opts: optsWithTokenSource,
146141
ServiceAccountID: "explicit-service-account",
147-
Version: "test-version",
142+
Version: testVersion,
148143
}
149144
client, err := NewClient(context.Background(), conf)
150145
if err != nil {
@@ -160,13 +155,12 @@ func TestNewClientWithServiceAccountID(t *testing.T) {
160155
if err := checkCookieVerifier(client.cookieVerifier, ""); err != nil {
161156
t.Errorf("NewClient().cookieVerifier: %v", err)
162157
}
158+
if err := checkUserManagementClient(client, ""); err != nil {
159+
t.Errorf("NewClient().userManagementClient: %v", err)
160+
}
163161
if client.clock != internal.SystemClock {
164162
t.Errorf("NewClient().clock = %v; want = SystemClock", client.clock)
165163
}
166-
wantVersion := "Go/Admin/test-version"
167-
if client.version != wantVersion {
168-
t.Errorf("NewClient().version = %q; want = %q", client.version, wantVersion)
169-
}
170164

171165
email, err := client.signer.Email(context.Background())
172166
if email != conf.ServiceAccountID || err != nil {
@@ -184,7 +178,7 @@ func TestNewClientWithUserCredentials(t *testing.T) {
184178
conf := &internal.AuthConfig{
185179
Creds: creds,
186180
Opts: []option.ClientOption{option.WithCredentials(creds)},
187-
Version: "test-version",
181+
Version: testVersion,
188182
}
189183
client, err := NewClient(context.Background(), conf)
190184
if err != nil {
@@ -200,13 +194,12 @@ func TestNewClientWithUserCredentials(t *testing.T) {
200194
if err := checkCookieVerifier(client.cookieVerifier, ""); err != nil {
201195
t.Errorf("NewClient().cookieVerifier: %v", err)
202196
}
197+
if err := checkUserManagementClient(client, ""); err != nil {
198+
t.Errorf("NewClient().userManagementClient: %v", err)
199+
}
203200
if client.clock != internal.SystemClock {
204201
t.Errorf("NewClient().clock = %v; want = SystemClock", client.clock)
205202
}
206-
wantVersion := "Go/Admin/test-version"
207-
if client.version != wantVersion {
208-
t.Errorf("NewClient().version = %q; want = %q", client.version, wantVersion)
209-
}
210203
}
211204

212205
func TestNewClientWithMalformedCredentials(t *testing.T) {
@@ -917,9 +910,7 @@ func getIDTokenWithKid(kid string, p mockIDTokenPayload) string {
917910
payload: pCopy,
918911
}
919912
token, err := info.Token(context.Background(), testSigner)
920-
if err != nil {
921-
log.Fatalln(err)
922-
}
913+
logFatal(err)
923914
return token
924915
}
925916

@@ -949,6 +940,31 @@ func checkCookieVerifier(tv *tokenVerifier, projectID string) error {
949940
return nil
950941
}
951942

943+
func checkUserManagementClient(client *Client, wantProjectID string) error {
944+
if client.baseURL != idToolkitV1Endpoint {
945+
return fmt.Errorf("baseURL = %q; want = %q", client.baseURL, idToolkitV1Endpoint)
946+
}
947+
if client.projectID != wantProjectID {
948+
return fmt.Errorf("projectID = %q; want = %q", client.projectID, wantProjectID)
949+
}
950+
951+
req, err := http.NewRequest(http.MethodGet, "https://firebase.google.com", nil)
952+
if err != nil {
953+
return err
954+
}
955+
956+
for _, opt := range client.httpClient.Opts {
957+
opt(req)
958+
}
959+
version := req.Header.Get("X-Client-Version")
960+
wantVersion := fmt.Sprintf("Go/Admin/%s", testVersion)
961+
if version != wantVersion {
962+
return fmt.Errorf("version = %q; want = %q", version, wantVersion)
963+
}
964+
965+
return nil
966+
}
967+
952968
func verifyCustomToken(ctx context.Context, token string, expected map[string]interface{}, t *testing.T) {
953969
if err := testIDTokenVerifier.verifySignature(ctx, token); err != nil {
954970
t.Fatal(err)
@@ -996,3 +1012,9 @@ func verifyCustomToken(ctx context.Context, token string, expected map[string]in
9961012
}
9971013
}
9981014
}
1015+
1016+
func logFatal(err error) {
1017+
if err != nil {
1018+
log.Fatal(err)
1019+
}
1020+
}

auth/email_action_links.go

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"encoding/json"
2020
"errors"
2121
"fmt"
22-
"net/http"
2322
"net/url"
2423
)
2524

@@ -129,18 +128,9 @@ func (c *userManagementClient) generateEmailActionLink(
129128
}
130129
}
131130

132-
resp, err := c.post(ctx, "/accounts:sendOobCode", payload)
133-
if err != nil {
134-
return "", err
135-
}
136-
137-
if resp.Status != http.StatusOK {
138-
return "", handleHTTPError(resp)
139-
}
140-
141131
var result struct {
142132
OOBLink string `json:"oobLink"`
143133
}
144-
err = json.Unmarshal(resp.Body, &result)
134+
_, err := c.post(ctx, "/accounts:sendOobCode", payload, &result)
145135
return result.OOBLink, err
146136
}

auth/export_users.go

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ package auth
1616

1717
import (
1818
"context"
19-
"encoding/json"
2019
"fmt"
2120
"net/http"
2221
"net/url"
2322
"strconv"
2423

24+
"firebase.google.com/go/internal"
2525
"google.golang.org/api/iterator"
2626
)
2727

@@ -79,25 +79,21 @@ func (it *UserIterator) fetch(pageSize int, pageToken string) (string, error) {
7979
query.Set("nextPageToken", pageToken)
8080
}
8181

82-
req, err := it.client.newRequest(http.MethodGet, fmt.Sprintf("/accounts:batchGet?%s", query.Encode()))
82+
url, err := it.client.makeUserMgtURL(fmt.Sprintf("/accounts:batchGet?%s", query.Encode()))
8383
if err != nil {
8484
return "", err
8585
}
8686

87-
resp, err := it.client.httpClient.Do(it.ctx, req)
88-
if err != nil {
89-
return "", err
90-
}
91-
92-
if resp.Status != http.StatusOK {
93-
return "", handleHTTPError(resp)
87+
req := &internal.Request{
88+
Method: http.MethodGet,
89+
URL: url,
9490
}
95-
9691
var parsed struct {
9792
Users []userQueryResponse `json:"users"`
9893
NextPageToken string `json:"nextPageToken"`
9994
}
100-
if err := json.Unmarshal(resp.Body, &parsed); err != nil {
95+
_, err = it.client.httpClient.DoAndUnmarshal(it.ctx, req, &parsed)
96+
if err != nil {
10197
return "", err
10298
}
10399

auth/import_users.go

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,8 @@ package auth
1717
import (
1818
"context"
1919
"encoding/base64"
20-
"encoding/json"
2120
"errors"
2221
"fmt"
23-
"net/http"
2422

2523
"firebase.google.com/go/internal"
2624
)
@@ -89,22 +87,14 @@ func (c *userManagementClient) ImportUsers(
8987
}
9088
}
9189

92-
resp, err := c.post(ctx, "/accounts:batchCreate", req)
93-
if err != nil {
94-
return nil, err
95-
}
96-
97-
if resp.Status != http.StatusOK {
98-
return nil, handleHTTPError(resp)
99-
}
100-
10190
var parsed struct {
10291
Error []struct {
10392
Index int `json:"index"`
10493
Message string `json:"message"`
10594
} `json:"error,omitempty"`
10695
}
107-
if err := json.Unmarshal(resp.Body, &parsed); err != nil {
96+
_, err := c.post(ctx, "/accounts:batchCreate", req, &parsed)
97+
if err != nil {
10898
return nil, err
10999
}
110100

auth/token_generator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ func newIAMSigner(ctx context.Context, config *internal.AuthConfig) (*iamSigner,
167167
mutex: &sync.Mutex{},
168168
httpClient: &internal.HTTPClient{Client: hc},
169169
serviceAcct: config.ServiceAccountID,
170-
metadataHost: "http://metadata",
170+
metadataHost: "http://metadata.google.internal",
171171
iamHost: "https://iam.googleapis.com",
172172
}, nil
173173
}

0 commit comments

Comments
 (0)