Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Universe Domain Resolution #1745

Merged
merged 3 commits into from
Feb 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 26 additions & 21 deletions src/auth/googleauth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -185,13 +185,6 @@ export class GoogleAuth<T extends AuthClient = JSONClient> {
private scopes?: string | string[];
private clientOptions: AuthClientOptions = {};

/**
* The cached universe domain.
*
* @see {@link GoogleAuth.getUniverseDomain}
*/
#universeDomain?: string = undefined;

/**
* Export DefaultTransporter as a static property of the class.
*/
Expand Down Expand Up @@ -220,7 +213,6 @@ export class GoogleAuth<T extends AuthClient = JSONClient> {

if (opts.universeDomain) {
this.clientOptions.universeDomain = opts.universeDomain;
this.#universeDomain = opts.universeDomain;
}
}

Expand Down Expand Up @@ -315,9 +307,13 @@ export class GoogleAuth<T extends AuthClient = JSONClient> {
return this._findProjectIdPromise;
}

async #getUniverseFromMetadataServer() {
if (!(await this._checkIsGCE())) return;

/**
* Retrieves a universe domain from the metadata server via
* {@link gcpMetadata.universe}.
*
* @returns a universe domain
*/
async getUniverseDomainFromMetadataServer(): Promise<string> {
let universeDomain: string;

try {
Expand All @@ -338,17 +334,18 @@ export class GoogleAuth<T extends AuthClient = JSONClient> {
* Retrieves, caches, and returns the universe domain in the following order
* of precedence:
* - The universe domain in {@link GoogleAuth.clientOptions}
* - {@link gcpMetadata.universe}
* - An existing or ADC {@link AuthClient}'s universe domain
* - {@link gcpMetadata.universe}, if {@link Compute} client
*
* @returns The universe domain
*/
async getUniverseDomain(): Promise<string> {
this.#universeDomain ??= originalOrCamelOptions(this.clientOptions).get(
let universeDomain = originalOrCamelOptions(this.clientOptions).get(
'universe_domain'
);
this.#universeDomain ??= await this.#getUniverseFromMetadataServer();
universeDomain ??= (await this.getClient()).universeDomain;

return this.#universeDomain || DEFAULT_UNIVERSE;
return universeDomain;
}

/**
Expand Down Expand Up @@ -438,7 +435,8 @@ export class GoogleAuth<T extends AuthClient = JSONClient> {
if (await this._checkIsGCE()) {
// set universe domain for Compute client
if (!originalOrCamelOptions(options).get('universe_domain')) {
options.universeDomain = await this.getUniverseDomain();
options.universeDomain =
await this.getUniverseDomainFromMetadataServer();
}

(options as ComputeOptions).scopes = this.getAnyScopes();
Expand Down Expand Up @@ -622,11 +620,8 @@ export class GoogleAuth<T extends AuthClient = JSONClient> {
}

// Create source client for impersonation
const sourceClient = new UserRefreshClient(
json.source_credentials.client_id,
json.source_credentials.client_secret,
json.source_credentials.refresh_token
);
const sourceClient = new UserRefreshClient();
sourceClient.fromJSON(json.source_credentials);

if (json.service_account_impersonation_url?.length > 256) {
/**
Expand All @@ -652,6 +647,7 @@ export class GoogleAuth<T extends AuthClient = JSONClient> {
const targetScopes = this.getAnyScopes() ?? [];

const client = new Impersonated({
...json,
delegates: json.delegates ?? [],
sourceClient: sourceClient,
targetPrincipal: targetPrincipal,
Expand All @@ -672,6 +668,10 @@ export class GoogleAuth<T extends AuthClient = JSONClient> {
): JSONClient {
let client: JSONClient;

// user's preferred universe domain
const preferredUniverseDomain =
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not a huge fan of this pattern, however the existing .fromJSON pattern makes it difficult to add preferred options. We should consider a refactor to [AuthClient].fromJSON(json, overrrides) later

originalOrCamelOptions(options).get('universe_domain');

if (json.type === USER_REFRESH_ACCOUNT_TYPE) {
client = new UserRefreshClient(options);
client.fromJSON(json);
Expand All @@ -694,6 +694,11 @@ export class GoogleAuth<T extends AuthClient = JSONClient> {
this.setGapicJWTValues(client);
client.fromJSON(json);
}

if (preferredUniverseDomain) {
client.universeDomain = preferredUniverseDomain;
}

return client;
}

Expand Down
1 change: 1 addition & 0 deletions src/auth/jwtclient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,7 @@ export class JWT extends OAuth2Client implements IdTokenProvider {
this.keyId = json.private_key_id;
this.projectId = json.project_id;
this.quotaProjectId = json.quota_project_id;
this.universeDomain = json.universe_domain || this.universeDomain;
}

/**
Expand Down
1 change: 1 addition & 0 deletions src/auth/refreshclient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ export class UserRefreshClient extends OAuth2Client {
this._refreshToken = json.refresh_token;
this.credentials.refresh_token = json.refresh_token;
this.quotaProjectId = json.quota_project_id;
this.universeDomain = json.universe_domain || this.universeDomain;
}

/**
Expand Down
5 changes: 3 additions & 2 deletions test/fixtures/private2.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
"client_email": "goodbye@youarecool.com",
"client_id": "client456",
"type": "service_account",
"project_id": "my-awesome-project"
}
"project_id": "my-awesome-project",
"universe_domain": "my-universe"
}
14 changes: 14 additions & 0 deletions test/test.googleauth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1568,6 +1568,20 @@ describe('googleauth', () => {
assert.equal(await auth.getUniverseDomain(), universeDomain);
});

it('should get the universe from ADC', async () => {
mockEnvVar(
'GOOGLE_APPLICATION_CREDENTIALS',
'./test/fixtures/private2.json'
);
const {universe_domain} = JSON.parse(
fs.readFileSync('./test/fixtures/private2.json', 'utf-8')
);

assert(universe_domain);
assert.notEqual(universe_domain, DEFAULT_UNIVERSE);
assert.equal(await auth.getUniverseDomain(), universe_domain);
});

it('should use the metadata service if on GCP', async () => {
const universeDomain = 'my.universe.com';
const scope = nockIsGCE({universeDomain});
Expand Down
Loading