Skip to content

Commit c6d5f3a

Browse files
committed
Completed app check integration
1 parent ebbb191 commit c6d5f3a

File tree

5 files changed

+32
-6
lines changed

5 files changed

+32
-6
lines changed

packages/data-connect/src/api/DataConnect.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ import { DataConnectTransport, TransportClass } from '../network';
3535
import { RESTTransport } from '../network/transport/rest';
3636

3737
import { MutationManager } from './Mutation';
38+
import { AppCheckTokenProvider } from '../core/AppCheckTokenProvider';
39+
import { AppCheckInternalComponentName, FirebaseAppCheckInternal } from '@firebase/app-check-interop-types';
3840

3941
/**
4042
* Connector Config for calling Data Connect backend.
@@ -89,11 +91,13 @@ export class DataConnect {
8991
private _transportClass: TransportClass | undefined;
9092
private _transportOptions?: TransportOptions;
9193
private _authTokenProvider?: AuthTokenProvider;
94+
private _appCheckTokenProvider?: AppCheckTokenProvider
9295
constructor(
9396
public readonly app: FirebaseApp,
9497
// TODO(mtewani): Replace with _dataConnectOptions in the future
9598
private readonly dataConnectOptions: DataConnectOptions,
96-
private readonly _authProvider: Provider<FirebaseAuthInternalName>
99+
private readonly _authProvider: Provider<FirebaseAuthInternalName>,
100+
private readonly _appCheckProvider: Provider<AppCheckInternalComponentName>
97101
) {
98102
if (typeof process !== 'undefined' && process.env) {
99103
const host = process.env[FIREBASE_DATA_CONNECT_EMULATOR_HOST_VAR];
@@ -135,12 +139,16 @@ export class DataConnect {
135139
this._authProvider
136140
);
137141
}
142+
if (this._appCheckProvider) {
143+
this._appCheckTokenProvider = new AppCheckTokenProvider(this.app.name, this._appCheckProvider);
144+
}
138145

139146
this.initialized = true;
140147
this._transport = new this._transportClass(
141148
this.dataConnectOptions,
142149
this.app.options.apiKey,
143-
this._authTokenProvider
150+
this._authTokenProvider,
151+
this._appCheckTokenProvider
144152
);
145153
if (this._transportOptions) {
146154
this._transport.useEmulator(

packages/data-connect/src/network/fetch.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ export function dcFetch<T, U>(
3030
url: string,
3131
body: U,
3232
{ signal }: AbortController,
33-
accessToken: string | null
33+
accessToken: string | null,
34+
appCheckToken: string | null
3435
) {
3536
if (!connectFetch) {
3637
throw new DataConnectError(Code.OTHER, 'No Fetch Implementation detected!');
@@ -42,6 +43,9 @@ export function dcFetch<T, U>(
4243
if (accessToken) {
4344
headers['X-Firebase-Auth-Token'] = accessToken;
4445
}
46+
if (appCheckToken) {
47+
headers['X-Firebase-AppCheck'] = appCheckToken;
48+
}
4549
const bodyStr = JSON.stringify(body);
4650
logDebug(`Making request out to ${url} with body: ${bodyStr}`);
4751
return connectFetch(url, {

packages/data-connect/src/network/transport/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717

1818
import { DataConnectOptions, TransportOptions } from '../../api/DataConnect';
19+
import { AppCheckTokenProvider } from '../../core/AppCheckTokenProvider';
1920
import { AuthTokenProvider } from '../../core/FirebaseAuthProvider';
2021

2122
// Change this to only specify specific args.
@@ -52,6 +53,7 @@ export type TransportClass = new (
5253
options: DataConnectOptions,
5354
apiKey?: string,
5455
authProvider?: AuthTokenProvider,
56+
appCheckProvider?: AppCheckTokenProvider,
5557
transportOptions?: TransportOptions
5658
) => DataConnectTransport;
5759
export * from '../../core/FirebaseAuthProvider';

packages/data-connect/src/network/transport/rest.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { addToken, urlBuilder } from '../../util/url';
2323
import { dcFetch } from '../fetch';
2424

2525
import { DataConnectTransport } from '.';
26+
import { AppCheckTokenProvider } from '../../core/AppCheckTokenProvider';
2627

2728
export class RESTTransport implements DataConnectTransport {
2829
private _host = '';
@@ -33,11 +34,13 @@ export class RESTTransport implements DataConnectTransport {
3334
private _project = 'p';
3435
private _serviceName: string;
3536
private _accessToken: string | null = null;
37+
private _appCheckToken: string | null = null;
3638
private _authInitialized = false;
3739
constructor(
3840
options: DataConnectOptions,
3941
private apiKey?: string | undefined,
4042
private authProvider?: AuthTokenProvider | undefined,
43+
private appCheckProvider?: AppCheckTokenProvider | undefined,
4144
transportOptions?: TransportOptions | undefined
4245
) {
4346
if (transportOptions) {
@@ -68,6 +71,11 @@ export class RESTTransport implements DataConnectTransport {
6871
logDebug(`New Token Available: ${token}`);
6972
this._accessToken = token;
7073
});
74+
this.appCheckProvider?.addTokenChangeListener(result => {
75+
const { token } = result;
76+
logDebug(`New App Check Token Available: ${token}`);
77+
this._appCheckToken = token;
78+
});
7179
}
7280
get endpointUrl(): string {
7381
return urlBuilder(
@@ -129,7 +137,8 @@ export class RESTTransport implements DataConnectTransport {
129137
variables: body
130138
} as unknown as U, // TODO(mtewani): This is a patch, fix this.
131139
abortController,
132-
this._accessToken
140+
this._accessToken,
141+
this._appCheckToken
133142
);
134143
});
135144

@@ -148,7 +157,8 @@ export class RESTTransport implements DataConnectTransport {
148157
variables: body
149158
} as unknown as U,
150159
abortController,
151-
this._accessToken
160+
this._accessToken,
161+
this._appCheckToken
152162
);
153163
});
154164

packages/data-connect/src/register.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export function registerDataConnect(variant?: string): void {
3636
(container, { instanceIdentifier: settings, options }) => {
3737
const app = container.getProvider('app').getImmediate()!;
3838
const authProvider = container.getProvider('auth-internal');
39+
const appCheckProvider = container.getProvider('app-check-internal');
3940
let newOpts = options as ConnectorConfig;
4041
if (settings) {
4142
newOpts = JSON.parse(settings);
@@ -46,7 +47,8 @@ export function registerDataConnect(variant?: string): void {
4647
return new DataConnect(
4748
app,
4849
{ ...newOpts, projectId: app.options.projectId! },
49-
authProvider
50+
authProvider,
51+
appCheckProvider
5052
);
5153
},
5254
ComponentType.PUBLIC

0 commit comments

Comments
 (0)