Skip to content

Commit da1495b

Browse files
authored
Add FAC getLimitedUseToken to internal interop interface (#4979)
* Add FAC getLimitedUseToken to internal interop interface * Typo * Changelog * Formatting * PR feedback
1 parent bbc9ca2 commit da1495b

File tree

6 files changed

+67
-2
lines changed

6 files changed

+67
-2
lines changed

appcheck/firebase-appcheck-interop/src/main/java/com/google/firebase/appcheck/interop/InteropAppCheckTokenProvider.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,15 @@ public interface InteropAppCheckTokenProvider {
2929
@NonNull
3030
Task<AppCheckTokenResult> getToken(boolean forceRefresh);
3131

32+
/**
33+
* Requests an {@link AppCheckTokenResult} from the installed {@code AppCheckFactory}. This will
34+
* always return a successful task, with an {@link AppCheckTokenResult} that contains either a
35+
* valid token, or a dummy token and an error string. The token returned from this method will be
36+
* a one-time use token.
37+
*/
38+
@NonNull
39+
Task<AppCheckTokenResult> getLimitedUseToken();
40+
3241
/**
3342
* Registers a listener to changes in the token state. There can be more than one listener
3443
* registered at the same time for one or more FirebaseAppAuth instances. The listeners call back

appcheck/firebase-appcheck/CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Unreleased
2-
2+
* [changed] Internal updates to allow Firebase SDKs to obtain limited-use tokens.
33

44
# 17.0.0
55
* [feature] Added [`getLimitedUseAppCheckToken()`](/docs/reference/android/com/google/firebase/appcheck/FirebaseAppCheck#getLimitedUseAppCheckToken())

appcheck/firebase-appcheck/firebase-appcheck.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ dependencies {
4646
implementation 'com.google.firebase:firebase-annotations:16.2.0'
4747
implementation 'com.google.firebase:firebase-common:20.3.1'
4848
implementation 'com.google.firebase:firebase-components:17.1.0'
49-
implementation 'com.google.firebase:firebase-appcheck-interop:17.0.0'
49+
implementation project(':appcheck:firebase-appcheck-interop')
5050
implementation 'com.google.android.gms:play-services-base:18.0.1'
5151
implementation 'com.google.android.gms:play-services-tasks:18.0.1'
5252

appcheck/firebase-appcheck/src/main/java/com/google/firebase/appcheck/internal/DefaultFirebaseAppCheck.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,28 @@ public Task<AppCheckTokenResult> getToken(boolean forceRefresh) {
213213
});
214214
}
215215

216+
@NonNull
217+
@Override
218+
public Task<AppCheckTokenResult> getLimitedUseToken() {
219+
return getLimitedUseAppCheckToken()
220+
.continueWithTask(
221+
liteExecutor,
222+
appCheckTokenTask -> {
223+
if (appCheckTokenTask.isSuccessful()) {
224+
return Tasks.forResult(
225+
DefaultAppCheckTokenResult.constructFromAppCheckToken(
226+
appCheckTokenTask.getResult()));
227+
}
228+
// If the token exchange failed, return a dummy token for integrators to attach
229+
// in their headers.
230+
return Tasks.forResult(
231+
DefaultAppCheckTokenResult.constructFromError(
232+
new FirebaseException(
233+
appCheckTokenTask.getException().getMessage(),
234+
appCheckTokenTask.getException())));
235+
});
236+
}
237+
216238
@NonNull
217239
@Override
218240
public Task<AppCheckToken> getAppCheckToken(boolean forceRefresh) {

appcheck/firebase-appcheck/src/test/java/com/google/firebase/appcheck/internal/DefaultFirebaseAppCheckTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,15 @@ public void testGetLimitedUseAppCheckToken_noFactoryInstalled_taskFails() throws
235235
assertThat(tokenTask.isSuccessful()).isFalse();
236236
}
237237

238+
@Test
239+
public void testGetLimitedUseToken_noFactoryInstalled_returnResultWithError() throws Exception {
240+
Task<AppCheckTokenResult> tokenTask = defaultFirebaseAppCheck.getLimitedUseToken();
241+
assertThat(tokenTask.isComplete()).isTrue();
242+
assertThat(tokenTask.isSuccessful()).isTrue();
243+
assertThat(tokenTask.getResult().getToken()).isNotNull();
244+
assertThat(tokenTask.getResult().getError()).isNotNull();
245+
}
246+
238247
@Test
239248
public void testGetToken_factoryInstalled_proxiesToAppCheckFactory() {
240249
defaultFirebaseAppCheck.installAppCheckProviderFactory(mockAppCheckProviderFactory);
@@ -422,4 +431,23 @@ public void testGetLimitedUseAppCheckToken_existingToken_requestsNewToken() {
422431

423432
verify(mockAppCheckProvider).getToken();
424433
}
434+
435+
@Test
436+
public void testGetLimitedUseToken_noExistingToken_requestsNewToken() {
437+
defaultFirebaseAppCheck.installAppCheckProviderFactory(mockAppCheckProviderFactory);
438+
439+
defaultFirebaseAppCheck.getLimitedUseToken();
440+
441+
verify(mockAppCheckProvider).getToken();
442+
}
443+
444+
@Test
445+
public void testGetLimitedUseToken_existingToken_requestsNewToken() {
446+
defaultFirebaseAppCheck.setCachedToken(validDefaultAppCheckToken);
447+
defaultFirebaseAppCheck.installAppCheckProviderFactory(mockAppCheckProviderFactory);
448+
449+
defaultFirebaseAppCheck.getLimitedUseToken();
450+
451+
verify(mockAppCheckProvider).getToken();
452+
}
425453
}

firebase-functions/src/androidTest/java/com/google/firebase/functions/TestInteropAppCheckTokenProvider.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,12 @@ public Task<AppCheckTokenResult> getToken(boolean forceRefresh) {
6666
return Tasks.forResult(testToken);
6767
}
6868

69+
@NonNull
70+
@Override
71+
public Task<AppCheckTokenResult> getLimitedUseToken() {
72+
return Tasks.forResult(testToken);
73+
}
74+
6975
@Override
7076
public void addAppCheckTokenListener(@NonNull AppCheckTokenListener listener) {}
7177

0 commit comments

Comments
 (0)