Skip to content
This repository was archived by the owner on Apr 4, 2023. It is now read-only.

Commit 742fe5b

Browse files
#1145 Added option to retrieve Firebase custom claims
1 parent 55b1ab8 commit 742fe5b

File tree

4 files changed

+54
-48
lines changed

4 files changed

+54
-48
lines changed

demo/app/main-view-model.ts

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
1-
import { RewardedVideoAdReward } from "nativescript-plugin-firebase/admob/admob";
2-
import { Observable } from "tns-core-modules/data/observable";
3-
import { alert, prompt } from "tns-core-modules/ui/dialogs";
4-
import { isAndroid, isIOS } from "tns-core-modules/platform";
51
import * as firebase from "nativescript-plugin-firebase";
62
import {
73
AddEventListenerResult,
84
admob as firebaseAdMob,
95
crashlytics as firebaseCrashlytics,
6+
GetAuthTokenResult,
7+
LogComplexEventTypeParameter,
108
performance as firebasePerformance,
119
storage as firebaseStorage,
12-
User,
13-
LogComplexEventTypeParameter
10+
User
1411
} from "nativescript-plugin-firebase";
12+
import { RewardedVideoAdReward } from "nativescript-plugin-firebase/admob/admob";
13+
import { FirebaseTrace } from "nativescript-plugin-firebase/performance/performance";
14+
import { Observable } from "tns-core-modules/data/observable";
1515
import * as fs from "tns-core-modules/file-system";
16+
import { isAndroid, isIOS } from "tns-core-modules/platform";
17+
import { alert, prompt } from "tns-core-modules/ui/dialogs";
1618
import { MessagingViewModel } from './messaging-view-model';
17-
import { FirebaseTrace } from "nativescript-plugin-firebase/performance/performance";
1819

1920
const firebaseWebApi = require("nativescript-plugin-firebase/app");
2021

@@ -1012,16 +1013,12 @@ export class HelloWorldModel extends Observable {
10121013
});
10131014

10141015
// now retrieve an auth token we can use to access Firebase from our server
1015-
firebase.getAuthToken({
1016-
forceRefresh: false
1017-
}).then(
1018-
token => {
1019-
console.log("Auth token retrieved: " + token);
1020-
},
1021-
errorMessage => {
1022-
console.log("Auth token retrieval error: " + errorMessage);
1023-
}
1024-
);
1016+
firebase.getAuthToken(
1017+
{
1018+
forceRefresh: false
1019+
})
1020+
.then((result: GetAuthTokenResult) => console.log("Auth token retrieved: " + JSON.stringify(result)))
1021+
.catch(errorMessage => console.log("Auth token retrieval error: " + errorMessage));
10251022
},
10261023
errorMessage => {
10271024
console.log("Login error: " + errorMessage);

src/firebase.android.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@ import * as appModule from "tns-core-modules/application";
22
import { AndroidActivityResultEventData } from "tns-core-modules/application";
33
import lazy from "tns-core-modules/utils/lazy";
44
import { ad as AndroidUtils } from "tns-core-modules/utils/utils";
5-
import { DataSnapshot, firestore, OnDisconnect as OnDisconnectBase, User } from "./firebase";
5+
import {
6+
DataSnapshot,
7+
firestore,
8+
GetAuthTokenOptions,
9+
GetAuthTokenResult,
10+
OnDisconnect as OnDisconnectBase,
11+
User
12+
} from "./firebase";
613
import {
714
DocumentSnapshot as DocumentSnapshotBase,
815
FieldValue,
@@ -128,7 +135,7 @@ firebase.toHashMap = obj => {
128135
if (fieldValue.type === "ARRAY_UNION") {
129136
// nested arrays are not allowed, so harden against wrong usage: arrayUnion(["foo", "bar"]) vs arrayUnion("foo", "bar")
130137
let values: Array<any> = Array.isArray(fieldValue.value[0]) ? fieldValue.value[0] : fieldValue.value;
131-
values = values.map(v => typeof(v) === "object" ? firebase.toHashMap(v) : v);
138+
values = values.map(v => typeof (v) === "object" ? firebase.toHashMap(v) : v);
132139
node.put(property, com.google.firebase.firestore.FieldValue.arrayUnion(values));
133140
} else if (fieldValue.type === "ARRAY_REMOVE") {
134141
node.put(property, com.google.firebase.firestore.FieldValue.arrayRemove(Array.isArray(fieldValue.value[0]) ? fieldValue.value[0] : fieldValue.value));
@@ -696,26 +703,19 @@ firebase.unlink = providerId => {
696703
});
697704
};
698705

699-
firebase.getAuthToken = arg => {
706+
firebase.getAuthToken = (arg: GetAuthTokenOptions): Promise<GetAuthTokenResult> => {
700707
return new Promise((resolve, reject) => {
701708
try {
702709
const firebaseAuth = com.google.firebase.auth.FirebaseAuth.getInstance();
703710
const user = firebaseAuth.getCurrentUser();
704711
if (user !== null) {
705712
const onSuccessListener = new gmsTasks.OnSuccessListener({
706-
onSuccess: getTokenResult => {
707-
if (arg.withClaims) {
708-
/* get token and custom claims previously set via the Firebase Admin SDK. */
709-
resolve(
710-
{
711-
token: getTokenResult.getToken(),
712-
claims: getTokenResult.getClaims()
713-
}
714-
);
715-
} else {
716-
/* get just token without custom claims */
717-
resolve(getTokenResult.getToken());
718-
}
713+
onSuccess: tokenResult => {
714+
resolve({
715+
token: tokenResult.getToken(),
716+
claims: firebase.toJsObject(tokenResult.getClaims()),
717+
signInProvider: tokenResult.getSignInProvider()
718+
});
719719
}
720720
});
721721

src/firebase.d.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,12 @@ export interface GetAuthTokenOptions {
202202
* Default false.
203203
*/
204204
forceRefresh?: boolean;
205-
/* Set this to true if you want any custom claims returned that you previously set via the Firebase Admin SDK. */
206-
withClaims?: boolean;
205+
}
206+
207+
export interface GetAuthTokenResult {
208+
token: string;
209+
claims: { [key: string]: any; };
210+
signInProvider: string;
207211
}
208212

209213
export interface Provider {
@@ -565,6 +569,7 @@ export function removeEventListeners(listeners: Array<any>, path: string): Promi
565569
export function onDisconnect(path: string): OnDisconnect;
566570

567571
export function enableLogging(logger?: boolean | ((a: string) => any), persistent?: boolean);
572+
568573
/**
569574
* Tells the client to keep its local cache in sync with the server automatically.
570575
*/
@@ -875,7 +880,7 @@ export function reauthenticate(options: ReauthenticateOptions): Promise<any>;
875880

876881
export function reloadUser(): Promise<void>;
877882

878-
export function getAuthToken(option: GetAuthTokenOptions): Promise<any>;
883+
export function getAuthToken(option: GetAuthTokenOptions): Promise<GetAuthTokenResult>;
879884

880885
export function logout(): Promise<any>;
881886

src/firebase.ios.ts

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
import * as application from "tns-core-modules/application/application";
2-
import { DataSnapshot, firestore, OnDisconnect as OnDisconnectBase, User } from "./firebase";
2+
import {
3+
DataSnapshot,
4+
firestore,
5+
GetAuthTokenOptions,
6+
GetAuthTokenResult,
7+
OnDisconnect as OnDisconnectBase,
8+
User
9+
} from "./firebase";
310
import {
411
DocumentSnapshot as DocumentSnapshotBase,
512
FieldValue,
@@ -662,7 +669,7 @@ function toLoginResult(user, additionalUserInfo?: FIRAdditionalUserInfo): User {
662669
return loginResult;
663670
}
664671

665-
firebase.getAuthToken = arg => {
672+
firebase.getAuthToken = (arg: GetAuthTokenOptions): Promise<GetAuthTokenResult> => {
666673
return new Promise((resolve, reject) => {
667674
try {
668675
const fAuth = FIRAuth.auth();
@@ -673,20 +680,17 @@ firebase.getAuthToken = arg => {
673680

674681
const user = fAuth.currentUser;
675682
if (user) {
676-
const onCompletion = (token, error) => {
683+
user.getIDTokenResultForcingRefreshCompletion(arg.forceRefresh, (result: FIRAuthTokenResult, error: NSError) => {
677684
if (error) {
678685
reject(error.localizedDescription);
679686
} else {
680-
resolve(token);
687+
resolve({
688+
token: result.token,
689+
claims: firebaseUtils.toJsObject(result.claims),
690+
signInProvider: result.signInProvider
691+
});
681692
}
682-
};
683-
/* get token and custom claims previously set via the Firebase Admin SDK. */
684-
if(arg.withClaims) {
685-
user.getIDTokenResultForcingRefreshCompletion(arg.forceRefresh, onCompletion);
686-
} else {
687-
/* get just token without custom claims */
688-
user.getIDTokenForcingRefreshCompletion(arg.forceRefresh, onCompletion);
689-
}
693+
});
690694
} else {
691695
reject("Log in first");
692696
}

0 commit comments

Comments
 (0)