in internal/proxy/proxy.go [316:405]
func credentialsOpt(c Config, l cloudsql.Logger) (cloudsqlconn.Option, error) {
// If service account impersonation is configured, set up an impersonated
// credentials token source.
if c.ImpersonationChain != "" {
var iopts []option.ClientOption
switch {
case c.Token != "":
l.Infof("Impersonating service account with OAuth2 token")
iopts = append(iopts, option.WithTokenSource(
oauth2.StaticTokenSource(&oauth2.Token{AccessToken: c.Token}),
))
case c.CredentialsFile != "":
l.Infof("Impersonating service account with the credentials file at %q", c.CredentialsFile)
iopts = append(iopts, option.WithCredentialsFile(c.CredentialsFile))
case c.CredentialsJSON != "":
l.Infof("Impersonating service account with JSON credentials environment variable")
iopts = append(iopts, option.WithCredentialsJSON([]byte(c.CredentialsJSON)))
case c.GcloudAuth:
l.Infof("Impersonating service account with gcloud user credentials")
ts, err := gcloud.TokenSource()
if err != nil {
return nil, err
}
iopts = append(iopts, option.WithTokenSource(ts))
default:
l.Infof("Impersonating service account with Application Default Credentials")
}
target, delegates := parseImpersonationChain(c.ImpersonationChain)
ts, err := impersonate.CredentialsTokenSource(
context.Background(),
impersonate.CredentialsConfig{
TargetPrincipal: target,
Delegates: delegates,
Scopes: []string{sqladmin.SqlserviceAdminScope},
},
iopts...,
)
if err != nil {
return nil, err
}
if c.IAMAuthN {
iamLoginTS, err := impersonate.CredentialsTokenSource(
context.Background(),
impersonate.CredentialsConfig{
TargetPrincipal: target,
Delegates: delegates,
Scopes: []string{iamLoginScope},
},
iopts...,
)
if err != nil {
return nil, err
}
return cloudsqlconn.WithIAMAuthNTokenSources(ts, iamLoginTS), nil
}
return cloudsqlconn.WithTokenSource(ts), nil
}
// Otherwise, configure credentials as usual.
var opt cloudsqlconn.Option
switch {
case c.Token != "":
l.Infof("Authorizing with OAuth2 token")
ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: c.Token})
if c.IAMAuthN {
lts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: c.LoginToken})
opt = cloudsqlconn.WithIAMAuthNTokenSources(ts, lts)
} else {
opt = cloudsqlconn.WithTokenSource(ts)
}
case c.CredentialsFile != "":
l.Infof("Authorizing with the credentials file at %q", c.CredentialsFile)
opt = cloudsqlconn.WithCredentialsFile(c.CredentialsFile)
case c.CredentialsJSON != "":
l.Infof("Authorizing with JSON credentials environment variable")
opt = cloudsqlconn.WithCredentialsJSON([]byte(c.CredentialsJSON))
case c.GcloudAuth:
l.Infof("Authorizing with gcloud user credentials")
ts, err := gcloud.TokenSource()
if err != nil {
return nil, err
}
opt = cloudsqlconn.WithTokenSource(ts)
default:
l.Infof("Authorizing with Application Default Credentials")
// Return no-op options to avoid having to handle nil in caller code
opt = cloudsqlconn.WithOptions()
}
return opt, nil
}