firebase / firebase/firebase-admin-node

[Data Connect] getDataConnect() ignores connector field in cache key

Offen
#3,054 2 Kommentare 1 Reaktion 1 zugewiesene Person Beansprucht von @stephenarosaj Auf GitHub ansehen
Vorherrschende Sprache
TypeScript
Sterne
1.7k
Forks
419
Ø Merge
3 T. 10 Std.
Gemergte PRs (30 T.)
16

Beschreibung

### [READ] Step 1: Are you in the right place?

Yes, this is a bug in the `firebase-admin/data-connect` module code.

### [REQUIRED] Step 2: Describe your environment

* Operating System version: macOS / Linux
* Firebase SDK version: firebase-admin@13.x (all versions with Data Connect support)
* Firebase Product: Data Connect
* Node.js version: 24.x
* NPM version: 11.x

### [REQUIRED] Step 3: Describe the problem

#### Summary

The `DataConnectService.getDataConnect()` method caches `DataConnect` instances using only `location` and `serviceId` as the cache key, ignoring the `connector` field from `ConnectorConfig`.

This causes incorrect behavior when using multiple connectors with the same Data Connect service.

#### Steps to reproduce:

1. Create a Data Connect service with multiple connectors (e.g., `public`, `user`, `admin`)
2. Call `getDataConnect()` with different connector configs that share the same `location` and `serviceId`
3. Observe that both calls return the same `DataConnect` instance

#### Expected behavior:

Each unique combination of `location`, `serviceId`, and `connector` should return a distinct `DataConnect` instance.

#### Actual behavior:

The second call returns the cached instance from the first call, ignoring the different `connector` value.

#### Relevant Code:

```typescript
import { getDataConnect, ConnectorConfig } from 'firebase-admin/data-connect';

const publicConfig: ConnectorConfig = {
location: 'us-west2',
serviceId: 'my-service',
connector: 'public',
};

const userConfig: ConnectorConfig = {
location: 'us-west2',
serviceId: 'my-service',
connector: 'user', // Different connector!
};

const publicDc = getDataConnect(publicConfig);
const userDc = getDataConnect(userConfig);

console.log(publicDc === userDc); // true (BUG! Should be false)
console.log(userDc.connectorConfig.connector); // 'public' (BUG! Should be 'user')
```

#### Impact:

When using multiple connectors (a common pattern for role-based access control), operations intended for one connector are incorrectly routed to another, causing "operation not found" errors.

#### Root cause:

In `src/data-connect/data-connect.ts`, line 39:

```typescript
const id = `${connectorConfig.location}-${connectorConfig.serviceId}`;
```

The cache key should also include the `connector` field:

```typescript
const id = `${connectorConfig.location}-${connectorConfig.serviceId}-${connectorConfig.connector ?? ''}`;
```

I have a fix ready with tests: #3055

Beitragsleitfaden

Beitragsleitfaden öffnen

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.