Skip to content

Commit e6be0e3

Browse files
fix(firebase): map jwt to psuedo user object on server
1 parent 302e7a2 commit e6be0e3

File tree

3 files changed

+39
-4
lines changed

3 files changed

+39
-4
lines changed

src/modules/firebase/auth/server.auth.module.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ function repairInlinePem(str?: string) {
1919
}
2020

2121
export function fbAdminFactory(es: EnvironmentService) {
22-
!firebaseAdminAppAlreadyExists &&
22+
!firebaseAdminAppAlreadyExists() &&
2323
initializeApp({
2424
credential: credential.cert({
2525
projectId: es.config.FIREBASE_PROJECT_ID,

src/modules/firebase/auth/server.auth.service.ts

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,59 @@
11
import { Injectable, Inject } from '@angular/core'
22
import {
33
FIREBASE_AUTH_SERVER_ADMIN_APP,
4-
FIREBASE_AUTH_SERVER_USER_JWT
4+
FIREBASE_AUTH_SERVER_USER_JWT,
5+
FIREBASE_AUTH_OBJ_TS
56
} from './server.common'
67
import { auth } from 'firebase-admin'
78
import { of } from 'rxjs'
8-
import { flatMap } from 'rxjs/operators'
9+
import { flatMap, catchError, map, tap } from 'rxjs/operators'
10+
import { TransferState } from '@angular/platform-browser'
911

1012
function validateToken(auth: auth.Auth, jwt: string) {
1113
return of(auth.verifyIdToken(jwt))
1214
}
1315

16+
function byMappingItToUndefined(err: any) {
17+
return of(undefined)
18+
}
19+
20+
function cacheToBrowser(ts: TransferState) {
21+
return function(obj: any) {
22+
ts.set(FIREBASE_AUTH_OBJ_TS, obj)
23+
}
24+
}
25+
26+
function toPsuedoUserObject(jwtObj: any) {
27+
return {
28+
isAnonymous: false, // TODO
29+
uid: jwtObj.uid,
30+
displayName: jwtObj.name,
31+
email: jwtObj.email,
32+
emailVerified: jwtObj.email_verified,
33+
photoURL: jwtObj.picture,
34+
phoneNumber: jwtObj.phone_number,
35+
// providerData: '',
36+
providerId: jwtObj.firebase && jwtObj.firebase.sign_in_provider
37+
}
38+
}
39+
1440
// tslint:disable:no-this
1541
// tslint:disable-next-line:no-class
1642
@Injectable()
1743
export class FirebaseServerAuth {
1844
constructor(
45+
private ts: TransferState,
1946
@Inject(FIREBASE_AUTH_SERVER_ADMIN_APP) private authAdmin: auth.Auth,
2047
@Inject(FIREBASE_AUTH_SERVER_USER_JWT) private jwt: string
2148
) {}
2249

2350
readonly validatedToken_ = this.jwt
24-
? validateToken(this.authAdmin, this.jwt).pipe(flatMap(a => a))
51+
? validateToken(this.authAdmin, this.jwt).pipe(
52+
flatMap(a => a),
53+
map(toPsuedoUserObject),
54+
tap(cacheToBrowser(this.ts)),
55+
catchError(byMappingItToUndefined)
56+
)
2557
: of(null)
2658

2759
readonly user = this.validatedToken_
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import { InjectionToken } from '@angular/core'
22
import { auth } from 'firebase-admin'
3+
import { makeStateKey } from '@angular/platform-browser'
34

45
export const FIREBASE_AUTH_SERVER_ADMIN_APP = new InjectionToken<auth.Auth>(
56
'fng.fb.svr.auth.admin'
67
)
78
export const FIREBASE_AUTH_SERVER_USER_JWT = new InjectionToken<string>(
89
'fng.fb.svr.auth.jwt'
910
)
11+
12+
export const FIREBASE_AUTH_OBJ_TS = makeStateKey('fng.fb.auth.ts')

0 commit comments

Comments
 (0)