@@ -292,43 +292,20 @@ func (c *Client) Dial(ep string) (*grpc.ClientConn, error) {
292292
293293func (c * Client ) getToken (ctx context.Context ) error {
294294 var err error // return last error in a case of fail
295- var auth * authenticator
296295
297- eps := c .Endpoints ()
298- for _ , ep := range eps {
299- // use dial options without dopts to avoid reusing the client balancer
300- var dOpts []grpc.DialOption
301- _ , host , _ := endpoint .ParseEndpoint (ep )
302- target := c .resolverGroup .Target (host )
303- creds := c .dialWithBalancerCreds (ep )
304- dOpts , err = c .dialSetupOpts (creds , c .cfg .DialOptions ... )
305- if err != nil {
306- err = fmt .Errorf ("failed to configure auth dialer: %v" , err )
307- continue
308- }
309- dOpts = append (dOpts , grpc .WithBalancerName (roundRobinBalancerName ))
310- auth , err = newAuthenticator (ctx , target , dOpts , c )
311- if err != nil {
312- continue
313- }
314- defer auth .close ()
315-
316- var resp * AuthenticateResponse
317- resp , err = auth .authenticate (ctx , c .Username , c .Password )
318- if err != nil {
319- // return err without retrying other endpoints
320- if err == rpctypes .ErrAuthNotEnabled {
321- c .authTokenBundle .UpdateAuthToken ("" )
322- return err
323- }
324- continue
325- }
326-
327- c .authTokenBundle .UpdateAuthToken (resp .Token )
296+ if c .Username == "" || c .Password == "" {
328297 return nil
329298 }
330299
331- return err
300+ resp , err := c .Auth .Authenticate (ctx , c .Username , c .Password )
301+ if err != nil {
302+ if err == rpctypes .ErrAuthNotEnabled {
303+ return nil
304+ }
305+ return err
306+ }
307+ c .authTokenBundle .UpdateAuthToken (resp .Token )
308+ return nil
332309}
333310
334311// dialWithBalancer dials the client's current load balanced resolver group. The scheme of the host
@@ -349,25 +326,7 @@ func (c *Client) dial(target string, creds grpccredentials.TransportCredentials,
349326
350327 if c .Username != "" && c .Password != "" {
351328 c .authTokenBundle = credentials .NewBundle (credentials.Config {})
352-
353- ctx , cancel := c .ctx , func () {}
354- if c .cfg .DialTimeout > 0 {
355- ctx , cancel = context .WithTimeout (ctx , c .cfg .DialTimeout )
356- }
357-
358- err = c .getToken (ctx )
359- if err != nil {
360- if toErr (ctx , err ) != rpctypes .ErrAuthNotEnabled {
361- if err == ctx .Err () && ctx .Err () != c .ctx .Err () {
362- err = context .DeadlineExceeded
363- }
364- cancel ()
365- return nil , err
366- }
367- } else {
368- opts = append (opts , grpc .WithPerRPCCredentials (c .authTokenBundle .PerRPCCredentials ()))
369- }
370- cancel ()
329+ opts = append (opts , grpc .WithPerRPCCredentials (c .authTokenBundle .PerRPCCredentials ()))
371330 }
372331
373332 opts = append (opts , c .cfg .DialOptions ... )
@@ -510,6 +469,19 @@ func newClient(cfg *Config) (*Client, error) {
510469 client .Auth = NewAuth (client )
511470 client .Maintenance = NewMaintenance (client )
512471
472+ //get token with established connection
473+ ctx , cancel = client .ctx , func () {}
474+ if client .cfg .DialTimeout > 0 {
475+ ctx , cancel = context .WithTimeout (ctx , client .cfg .DialTimeout )
476+ }
477+ err = client .getToken (ctx )
478+ if err != nil {
479+ client .Close ()
480+ cancel ()
481+ return nil , err
482+ }
483+ cancel ()
484+
513485 if cfg .RejectOldCluster {
514486 if err := client .checkVersion (); err != nil {
515487 client .Close ()
0 commit comments