Skip to content

Commit f6ba199

Browse files
committed
Resolve TokenAudience from host metadata for account hosts
Port of Python SDK PR #1321. When host metadata indicates an account host (no workspace_id) and account_id is present, automatically set TokenAudience to the account_id if not already configured by the user. Co-authored-by: Isaac
1 parent 933f570 commit f6ba199

2 files changed

Lines changed: 67 additions & 0 deletions

File tree

config/config.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,10 @@ func (c *Config) applyHostMetadata(ctx context.Context, meta *hostMetadata) {
689689
c.Cloud = c.Environment().Cloud
690690
logger.Debugf(ctx, "Resolved cloud from hostname: %q", c.Cloud)
691691
}
692+
if c.TokenAudience == "" && meta.WorkspaceID == "" && c.AccountID != "" {
693+
logger.Debugf(ctx, "Setting token_audience to account_id for account host: %q", c.AccountID)
694+
c.TokenAudience = c.AccountID
695+
}
692696
if c.DiscoveryURL == "" {
693697
if meta.OIDCEndpoint == "" {
694698
logger.Warnf(ctx, "Host metadata missing oidc_endpoint; skipping discovery URL resolution")

config/config_test.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -832,6 +832,69 @@ func TestEnsureResolved_HostMetadata_MissingAccountIdWithPlaceholder_Warns(t *te
832832
assert.Empty(t, cfg.DiscoveryURL)
833833
}
834834

835+
func TestApplyHostMetadata_SetsTokenAudienceForAccountHost(t *testing.T) {
836+
noopLoader := mockLoader(func(cfg *Config) error { return nil })
837+
cfg := &Config{
838+
Host: testHMHost,
839+
Experimental_IsUnifiedHost: true,
840+
Loaders: []Loader{noopLoader},
841+
HTTPTransport: fixtures.SliceTransport{
842+
{
843+
Method: "GET",
844+
Resource: "/.well-known/databricks-config",
845+
Status: 200,
846+
Response: `{"oidc_endpoint": "` + testHMHost + `/oidc", "account_id": "` + testHMAccountID + `", "cloud": "AWS"}`,
847+
},
848+
},
849+
}
850+
err := cfg.EnsureResolved()
851+
require.NoError(t, err)
852+
// No workspace_id and has account_id → token audience should be set
853+
assert.Equal(t, testHMAccountID, cfg.TokenAudience)
854+
}
855+
856+
func TestApplyHostMetadata_NoTokenAudienceForWorkspaceHost(t *testing.T) {
857+
noopLoader := mockLoader(func(cfg *Config) error { return nil })
858+
cfg := &Config{
859+
Host: testHMHost,
860+
Experimental_IsUnifiedHost: true,
861+
Loaders: []Loader{noopLoader},
862+
HTTPTransport: fixtures.SliceTransport{
863+
{
864+
Method: "GET",
865+
Resource: "/.well-known/databricks-config",
866+
Status: 200,
867+
Response: `{"oidc_endpoint": "` + testHMHost + `/oidc", "account_id": "` + testHMAccountID + `", "workspace_id": "` + testHMWorkspaceID + `", "cloud": "AWS"}`,
868+
},
869+
},
870+
}
871+
err := cfg.EnsureResolved()
872+
require.NoError(t, err)
873+
// Has workspace_id → token audience should NOT be set
874+
assert.Empty(t, cfg.TokenAudience)
875+
}
876+
877+
func TestApplyHostMetadata_DoesNotOverrideExistingTokenAudience(t *testing.T) {
878+
noopLoader := mockLoader(func(cfg *Config) error { return nil })
879+
cfg := &Config{
880+
Host: testHMHost,
881+
TokenAudience: "custom-audience",
882+
Experimental_IsUnifiedHost: true,
883+
Loaders: []Loader{noopLoader},
884+
HTTPTransport: fixtures.SliceTransport{
885+
{
886+
Method: "GET",
887+
Resource: "/.well-known/databricks-config",
888+
Status: 200,
889+
Response: `{"oidc_endpoint": "` + testHMHost + `/oidc", "account_id": "` + testHMAccountID + `", "cloud": "AWS"}`,
890+
},
891+
},
892+
}
893+
err := cfg.EnsureResolved()
894+
require.NoError(t, err)
895+
assert.Equal(t, "custom-audience", cfg.TokenAudience)
896+
}
897+
835898
func TestConfig_ResolveHostMetadata_Clouds(t *testing.T) {
836899
tests := []struct {
837900
name string

0 commit comments

Comments
 (0)