Skip to content

Commit d30698d

Browse files
authored
Hoisted userManagementClient and providerConfigClient into baseClient (#317)
* Hoisted userManagementClient and providerConfigClient into baseClient * Removed providerConfigClient
1 parent 945b1b1 commit d30698d

12 files changed

+109
-168
lines changed

auth/auth.go

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -93,16 +93,25 @@ func NewClient(ctx context.Context, conf *internal.AuthConfig) (*Client, error)
9393
return nil, err
9494
}
9595

96-
hc, _, err := transport.NewHTTPClient(ctx, conf.Opts...)
96+
transport, _, err := transport.NewHTTPClient(ctx, conf.Opts...)
9797
if err != nil {
9898
return nil, err
9999
}
100100

101+
hc := internal.WithDefaultRetryConfig(transport)
102+
hc.CreateErrFn = handleHTTPError
103+
hc.SuccessFn = internal.HasSuccessStatus
104+
hc.Opts = []internal.HTTPOption{
105+
internal.WithHeader("X-Client-Version", fmt.Sprintf("Go/Admin/%s", conf.Version)),
106+
}
107+
101108
base := &baseClient{
102-
userManagementClient: newUserManagementClient(hc, conf),
103-
providerConfigClient: newProviderConfigClient(hc, conf),
104-
idTokenVerifier: idTokenVerifier,
105-
cookieVerifier: cookieVerifier,
109+
userManagementEndpoint: idToolkitV1Endpoint,
110+
providerConfigEndpoint: providerConfigEndpoint,
111+
projectID: conf.ProjectID,
112+
httpClient: hc,
113+
idTokenVerifier: idTokenVerifier,
114+
cookieVerifier: cookieVerifier,
106115
}
107116
return &Client{
108117
baseClient: base,
@@ -183,7 +192,7 @@ func (c *Client) SessionCookie(
183192
idToken string,
184193
expiresIn time.Duration,
185194
) (string, error) {
186-
return c.baseClient.userManagementClient.createSessionCookie(ctx, idToken, expiresIn)
195+
return c.baseClient.createSessionCookie(ctx, idToken, expiresIn)
187196
}
188197

189198
// Token represents a decoded Firebase ID token.
@@ -213,22 +222,21 @@ type FirebaseInfo struct {
213222
Identities map[string]interface{} `json:"identities"`
214223
}
215224

225+
// baseClient exposes the APIs common to both auth.Client and auth.TenantClient.
216226
type baseClient struct {
217-
*userManagementClient
218-
*providerConfigClient
219-
idTokenVerifier *tokenVerifier
220-
cookieVerifier *tokenVerifier
221-
tenantID string
227+
userManagementEndpoint string
228+
providerConfigEndpoint string
229+
projectID string
230+
tenantID string
231+
httpClient *internal.HTTPClient
232+
idTokenVerifier *tokenVerifier
233+
cookieVerifier *tokenVerifier
222234
}
223235

224236
func (c *baseClient) withTenantID(tenantID string) *baseClient {
225-
return &baseClient{
226-
userManagementClient: c.userManagementClient.withTenantID(tenantID),
227-
providerConfigClient: c.providerConfigClient.withTenantID(tenantID),
228-
idTokenVerifier: c.idTokenVerifier,
229-
cookieVerifier: c.cookieVerifier,
230-
tenantID: tenantID,
231-
}
237+
copy := *c
238+
copy.tenantID = tenantID
239+
return &copy
232240
}
233241

234242
// VerifyIDToken verifies the signature and payload of the provided ID token.

auth/auth_test.go

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ func TestNewClientWithServiceAccountCredentials(t *testing.T) {
100100
if err := checkCookieVerifier(client.cookieVerifier, creds.ProjectID); err != nil {
101101
t.Errorf("NewClient().cookieVerifier: %v", err)
102102
}
103-
if err := checkUserManagementClient(client, creds.ProjectID); err != nil {
104-
t.Errorf("NewClient().userManagementClient: %v", err)
103+
if err := checkBaseClient(client, creds.ProjectID); err != nil {
104+
t.Errorf("NewClient().baseClient: %v", err)
105105
}
106106
if client.clock != internal.SystemClock {
107107
t.Errorf("NewClient().clock = %v; want = SystemClock", client.clock)
@@ -127,8 +127,8 @@ func TestNewClientWithoutCredentials(t *testing.T) {
127127
if err := checkCookieVerifier(client.cookieVerifier, ""); err != nil {
128128
t.Errorf("NewClient().cookieVerifier: %v", err)
129129
}
130-
if err := checkUserManagementClient(client, ""); err != nil {
131-
t.Errorf("NewClient().userManagementClient: %v", err)
130+
if err := checkBaseClient(client, ""); err != nil {
131+
t.Errorf("NewClient().baseClient: %v", err)
132132
}
133133
if client.clock != internal.SystemClock {
134134
t.Errorf("NewClient().clock = %v; want = SystemClock", client.clock)
@@ -155,8 +155,8 @@ func TestNewClientWithServiceAccountID(t *testing.T) {
155155
if err := checkCookieVerifier(client.cookieVerifier, ""); err != nil {
156156
t.Errorf("NewClient().cookieVerifier: %v", err)
157157
}
158-
if err := checkUserManagementClient(client, ""); err != nil {
159-
t.Errorf("NewClient().userManagementClient: %v", err)
158+
if err := checkBaseClient(client, ""); err != nil {
159+
t.Errorf("NewClient().baseClient: %v", err)
160160
}
161161
if client.clock != internal.SystemClock {
162162
t.Errorf("NewClient().clock = %v; want = SystemClock", client.clock)
@@ -194,8 +194,8 @@ func TestNewClientWithUserCredentials(t *testing.T) {
194194
if err := checkCookieVerifier(client.cookieVerifier, ""); err != nil {
195195
t.Errorf("NewClient().cookieVerifier: %v", err)
196196
}
197-
if err := checkUserManagementClient(client, ""); err != nil {
198-
t.Errorf("NewClient().userManagementClient: %v", err)
197+
if err := checkBaseClient(client, ""); err != nil {
198+
t.Errorf("NewClient().baseClient: %v", err)
199199
}
200200
if client.clock != internal.SystemClock {
201201
t.Errorf("NewClient().clock = %v; want = SystemClock", client.clock)
@@ -1057,10 +1057,13 @@ func checkCookieVerifier(tv *tokenVerifier, projectID string) error {
10571057
return nil
10581058
}
10591059

1060-
func checkUserManagementClient(client *Client, wantProjectID string) error {
1061-
umc := client.userManagementClient
1062-
if umc.baseURL != idToolkitV1Endpoint {
1063-
return fmt.Errorf("baseURL = %q; want = %q", umc.baseURL, idToolkitV1Endpoint)
1060+
func checkBaseClient(client *Client, wantProjectID string) error {
1061+
umc := client.baseClient
1062+
if umc.userManagementEndpoint != idToolkitV1Endpoint {
1063+
return fmt.Errorf("userManagementEndpoint = %q; want = %q", umc.userManagementEndpoint, idToolkitV1Endpoint)
1064+
}
1065+
if umc.providerConfigEndpoint != providerConfigEndpoint {
1066+
return fmt.Errorf("providerConfigEndpoint = %q; want = %q", umc.providerConfigEndpoint, providerConfigEndpoint)
10641067
}
10651068
if umc.projectID != wantProjectID {
10661069
return fmt.Errorf("projectID = %q; want = %q", umc.projectID, wantProjectID)

auth/email_action_links.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,38 +71,38 @@ const (
7171

7272
// EmailVerificationLink generates the out-of-band email action link for email verification flows for the specified
7373
// email address.
74-
func (c *userManagementClient) EmailVerificationLink(ctx context.Context, email string) (string, error) {
74+
func (c *baseClient) EmailVerificationLink(ctx context.Context, email string) (string, error) {
7575
return c.EmailVerificationLinkWithSettings(ctx, email, nil)
7676
}
7777

7878
// EmailVerificationLinkWithSettings generates the out-of-band email action link for email verification flows for the
7979
// specified email address, using the action code settings provided.
80-
func (c *userManagementClient) EmailVerificationLinkWithSettings(
80+
func (c *baseClient) EmailVerificationLinkWithSettings(
8181
ctx context.Context, email string, settings *ActionCodeSettings) (string, error) {
8282
return c.generateEmailActionLink(ctx, emailVerification, email, settings)
8383
}
8484

8585
// PasswordResetLink generates the out-of-band email action link for password reset flows for the specified email
8686
// address.
87-
func (c *userManagementClient) PasswordResetLink(ctx context.Context, email string) (string, error) {
87+
func (c *baseClient) PasswordResetLink(ctx context.Context, email string) (string, error) {
8888
return c.PasswordResetLinkWithSettings(ctx, email, nil)
8989
}
9090

9191
// PasswordResetLinkWithSettings generates the out-of-band email action link for password reset flows for the
9292
// specified email address, using the action code settings provided.
93-
func (c *userManagementClient) PasswordResetLinkWithSettings(
93+
func (c *baseClient) PasswordResetLinkWithSettings(
9494
ctx context.Context, email string, settings *ActionCodeSettings) (string, error) {
9595
return c.generateEmailActionLink(ctx, passwordReset, email, settings)
9696
}
9797

9898
// EmailSignInLink generates the out-of-band email action link for email link sign-in flows, using the action
9999
// code settings provided.
100-
func (c *userManagementClient) EmailSignInLink(
100+
func (c *baseClient) EmailSignInLink(
101101
ctx context.Context, email string, settings *ActionCodeSettings) (string, error) {
102102
return c.generateEmailActionLink(ctx, emailLinkSignIn, email, settings)
103103
}
104104

105-
func (c *userManagementClient) generateEmailActionLink(
105+
func (c *baseClient) generateEmailActionLink(
106106
ctx context.Context, linkType linkType, email string, settings *ActionCodeSettings) (string, error) {
107107

108108
if email == "" {

auth/email_action_links_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ func TestEmailVerificationLinkError(t *testing.T) {
273273
}
274274
s := echoServer(testActionLinkResponse, t)
275275
defer s.Close()
276-
s.Client.userManagementClient.httpClient.RetryConfig = nil
276+
s.Client.baseClient.httpClient.RetryConfig = nil
277277
s.Status = http.StatusInternalServerError
278278

279279
for code, check := range cases {

auth/export_users.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const maxReturnedResults = 1000
3131
//
3232
// If nextPageToken is empty, the iterator will start at the beginning.
3333
// If the nextPageToken is not empty, the iterator starts after the token.
34-
func (c *userManagementClient) Users(ctx context.Context, nextPageToken string) *UserIterator {
34+
func (c *baseClient) Users(ctx context.Context, nextPageToken string) *UserIterator {
3535
it := &UserIterator{
3636
ctx: ctx,
3737
client: c,
@@ -49,7 +49,7 @@ func (c *userManagementClient) Users(ctx context.Context, nextPageToken string)
4949
//
5050
// Also see: https://github.com/GoogleCloudPlatform/google-cloud-go/wiki/Iterator-Guidelines
5151
type UserIterator struct {
52-
client *userManagementClient
52+
client *baseClient
5353
ctx context.Context
5454
nextFunc func() error
5555
pageInfo *iterator.PageInfo

auth/import_users.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ type ErrorInfo struct {
5050
//
5151
// No more than 1000 users can be imported in a single call. If at least one user specifies a
5252
// password, a UserImportHash must be specified as an option.
53-
func (c *userManagementClient) ImportUsers(
53+
func (c *baseClient) ImportUsers(
5454
ctx context.Context, users []*UserToImport, opts ...UserImportOption) (*UserImportResult, error) {
5555

5656
if len(users) == 0 {

auth/provider_config.go

Lines changed: 17 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ func (config *OIDCProviderConfigToUpdate) buildRequest() (nestedMap, error) {
247247

248248
// OIDCProviderConfigIterator is an iterator over OIDC provider configurations.
249249
type OIDCProviderConfigIterator struct {
250-
client *providerConfigClient
250+
client *baseClient
251251
ctx context.Context
252252
nextFunc func() error
253253
pageInfo *iterator.PageInfo
@@ -538,7 +538,7 @@ func (config *SAMLProviderConfigToUpdate) buildRequest() (nestedMap, error) {
538538

539539
// SAMLProviderConfigIterator is an iterator over SAML provider configurations.
540540
type SAMLProviderConfigIterator struct {
541-
client *providerConfigClient
541+
client *baseClient
542542
ctx context.Context
543543
nextFunc func() error
544544
pageInfo *iterator.PageInfo
@@ -595,36 +595,8 @@ func (it *SAMLProviderConfigIterator) fetch(pageSize int, pageToken string) (str
595595
return result.NextPageToken, nil
596596
}
597597

598-
type providerConfigClient struct {
599-
endpoint string
600-
projectID string
601-
tenantID string
602-
httpClient *internal.HTTPClient
603-
}
604-
605-
func newProviderConfigClient(client *http.Client, conf *internal.AuthConfig) *providerConfigClient {
606-
hc := internal.WithDefaultRetryConfig(client)
607-
hc.CreateErrFn = handleHTTPError
608-
hc.SuccessFn = internal.HasSuccessStatus
609-
hc.Opts = []internal.HTTPOption{
610-
internal.WithHeader("X-Client-Version", fmt.Sprintf("Go/Admin/%s", conf.Version)),
611-
}
612-
613-
return &providerConfigClient{
614-
endpoint: providerConfigEndpoint,
615-
projectID: conf.ProjectID,
616-
httpClient: hc,
617-
}
618-
}
619-
620-
func (c *providerConfigClient) withTenantID(tenantID string) *providerConfigClient {
621-
copy := *c
622-
copy.tenantID = tenantID
623-
return &copy
624-
}
625-
626598
// OIDCProviderConfig returns the OIDCProviderConfig with the given ID.
627-
func (c *providerConfigClient) OIDCProviderConfig(ctx context.Context, id string) (*OIDCProviderConfig, error) {
599+
func (c *baseClient) OIDCProviderConfig(ctx context.Context, id string) (*OIDCProviderConfig, error) {
628600
if err := validateOIDCConfigID(id); err != nil {
629601
return nil, err
630602
}
@@ -642,7 +614,7 @@ func (c *providerConfigClient) OIDCProviderConfig(ctx context.Context, id string
642614
}
643615

644616
// CreateOIDCProviderConfig creates a new OIDC provider config from the given parameters.
645-
func (c *providerConfigClient) CreateOIDCProviderConfig(ctx context.Context, config *OIDCProviderConfigToCreate) (*OIDCProviderConfig, error) {
617+
func (c *baseClient) CreateOIDCProviderConfig(ctx context.Context, config *OIDCProviderConfigToCreate) (*OIDCProviderConfig, error) {
646618
if config == nil {
647619
return nil, errors.New("config must not be nil")
648620
}
@@ -669,7 +641,7 @@ func (c *providerConfigClient) CreateOIDCProviderConfig(ctx context.Context, con
669641
}
670642

671643
// UpdateOIDCProviderConfig updates an existing OIDC provider config with the given parameters.
672-
func (c *providerConfigClient) UpdateOIDCProviderConfig(ctx context.Context, id string, config *OIDCProviderConfigToUpdate) (*OIDCProviderConfig, error) {
644+
func (c *baseClient) UpdateOIDCProviderConfig(ctx context.Context, id string, config *OIDCProviderConfigToUpdate) (*OIDCProviderConfig, error) {
673645
if err := validateOIDCConfigID(id); err != nil {
674646
return nil, err
675647
}
@@ -704,7 +676,7 @@ func (c *providerConfigClient) UpdateOIDCProviderConfig(ctx context.Context, id
704676
}
705677

706678
// DeleteOIDCProviderConfig deletes the OIDCProviderConfig with the given ID.
707-
func (c *providerConfigClient) DeleteOIDCProviderConfig(ctx context.Context, id string) error {
679+
func (c *baseClient) DeleteOIDCProviderConfig(ctx context.Context, id string) error {
708680
if err := validateOIDCConfigID(id); err != nil {
709681
return err
710682
}
@@ -721,7 +693,7 @@ func (c *providerConfigClient) DeleteOIDCProviderConfig(ctx context.Context, id
721693
//
722694
// If nextPageToken is empty, the iterator will start at the beginning. Otherwise,
723695
// iterator starts after the token.
724-
func (c *providerConfigClient) OIDCProviderConfigs(ctx context.Context, nextPageToken string) *OIDCProviderConfigIterator {
696+
func (c *baseClient) OIDCProviderConfigs(ctx context.Context, nextPageToken string) *OIDCProviderConfigIterator {
725697
it := &OIDCProviderConfigIterator{
726698
ctx: ctx,
727699
client: c,
@@ -736,7 +708,7 @@ func (c *providerConfigClient) OIDCProviderConfigs(ctx context.Context, nextPage
736708
}
737709

738710
// SAMLProviderConfig returns the SAMLProviderConfig with the given ID.
739-
func (c *providerConfigClient) SAMLProviderConfig(ctx context.Context, id string) (*SAMLProviderConfig, error) {
711+
func (c *baseClient) SAMLProviderConfig(ctx context.Context, id string) (*SAMLProviderConfig, error) {
740712
if err := validateSAMLConfigID(id); err != nil {
741713
return nil, err
742714
}
@@ -754,7 +726,7 @@ func (c *providerConfigClient) SAMLProviderConfig(ctx context.Context, id string
754726
}
755727

756728
// CreateSAMLProviderConfig creates a new SAML provider config from the given parameters.
757-
func (c *providerConfigClient) CreateSAMLProviderConfig(ctx context.Context, config *SAMLProviderConfigToCreate) (*SAMLProviderConfig, error) {
729+
func (c *baseClient) CreateSAMLProviderConfig(ctx context.Context, config *SAMLProviderConfigToCreate) (*SAMLProviderConfig, error) {
758730
if config == nil {
759731
return nil, errors.New("config must not be nil")
760732
}
@@ -781,7 +753,7 @@ func (c *providerConfigClient) CreateSAMLProviderConfig(ctx context.Context, con
781753
}
782754

783755
// UpdateSAMLProviderConfig updates an existing SAML provider config with the given parameters.
784-
func (c *providerConfigClient) UpdateSAMLProviderConfig(ctx context.Context, id string, config *SAMLProviderConfigToUpdate) (*SAMLProviderConfig, error) {
756+
func (c *baseClient) UpdateSAMLProviderConfig(ctx context.Context, id string, config *SAMLProviderConfigToUpdate) (*SAMLProviderConfig, error) {
785757
if err := validateSAMLConfigID(id); err != nil {
786758
return nil, err
787759
}
@@ -816,7 +788,7 @@ func (c *providerConfigClient) UpdateSAMLProviderConfig(ctx context.Context, id
816788
}
817789

818790
// DeleteSAMLProviderConfig deletes the SAMLProviderConfig with the given ID.
819-
func (c *providerConfigClient) DeleteSAMLProviderConfig(ctx context.Context, id string) error {
791+
func (c *baseClient) DeleteSAMLProviderConfig(ctx context.Context, id string) error {
820792
if err := validateSAMLConfigID(id); err != nil {
821793
return err
822794
}
@@ -833,7 +805,7 @@ func (c *providerConfigClient) DeleteSAMLProviderConfig(ctx context.Context, id
833805
//
834806
// If nextPageToken is empty, the iterator will start at the beginning. Otherwise,
835807
// iterator starts after the token.
836-
func (c *providerConfigClient) SAMLProviderConfigs(ctx context.Context, nextPageToken string) *SAMLProviderConfigIterator {
808+
func (c *baseClient) SAMLProviderConfigs(ctx context.Context, nextPageToken string) *SAMLProviderConfigIterator {
837809
it := &SAMLProviderConfigIterator{
838810
ctx: ctx,
839811
client: c,
@@ -847,15 +819,17 @@ func (c *providerConfigClient) SAMLProviderConfigs(ctx context.Context, nextPage
847819
return it
848820
}
849821

850-
func (c *providerConfigClient) makeRequest(ctx context.Context, req *internal.Request, v interface{}) (*internal.Response, error) {
822+
func (c *baseClient) makeRequest(
823+
ctx context.Context, req *internal.Request, v interface{}) (*internal.Response, error) {
824+
851825
if c.projectID == "" {
852826
return nil, errors.New("project id not available")
853827
}
854828

855829
if c.tenantID != "" {
856-
req.URL = fmt.Sprintf("%s/projects/%s/tenants/%s%s", c.endpoint, c.projectID, c.tenantID, req.URL)
830+
req.URL = fmt.Sprintf("%s/projects/%s/tenants/%s%s", c.providerConfigEndpoint, c.projectID, c.tenantID, req.URL)
857831
} else {
858-
req.URL = fmt.Sprintf("%s/projects/%s%s", c.endpoint, c.projectID, req.URL)
832+
req.URL = fmt.Sprintf("%s/projects/%s%s", c.providerConfigEndpoint, c.projectID, req.URL)
859833
}
860834

861835
return c.httpClient.DoAndUnmarshal(ctx, req, v)

0 commit comments

Comments
 (0)