Skip to content

Commit 4fadba7

Browse files
committed
feat(ssr): use env credentials in prod
1 parent d4bd405 commit 4fadba7

File tree

4 files changed

+29
-18
lines changed

4 files changed

+29
-18
lines changed

packages/nuxt/src/runtime/plugins/admin.server.ts

+11-12
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import admin from 'firebase-admin'
1+
import { initializeApp, cert, getApp, getApps } from 'firebase-admin/app'
22
import { VueFireAppCheckServer } from 'vuefire/server'
3-
import { config } from 'firebase-functions'
43
import type { FirebaseApp } from '@firebase/app-types'
54
import { defineNuxtPlugin, useAppConfig } from '#app'
65

@@ -17,15 +16,15 @@ export default defineNuxtPlugin((nuxtApp) => {
1716
const firebaseApp = nuxtApp.$firebaseApp as FirebaseApp
1817

1918
// only initialize the admin sdk once
20-
if (!admin.apps.length) {
21-
const adminApp = admin.initializeApp({
22-
...firebaseAdmin.config,
23-
credential:
24-
// when deployed we get direct access to the config
25-
process.env.NODE_ENV === 'production'
26-
? config().firebase
27-
: admin.credential.cert(firebaseAdmin.serviceAccount),
28-
})
19+
if (!getApps().length) {
20+
const adminApp =
21+
// this is specified when deployed on Firebase and automatically picks up the credentials from env variables
22+
process.env.GCLOUD_PROJECT
23+
? initializeApp()
24+
: initializeApp({
25+
...firebaseAdmin.config,
26+
credential: cert(firebaseAdmin.serviceAccount),
27+
})
2928

3029
if (vuefireOptions.appCheck) {
3130
// NOTE: necessary in VueFireAppCheckServer
@@ -41,7 +40,7 @@ export default defineNuxtPlugin((nuxtApp) => {
4140

4241
return {
4342
provide: {
44-
adminApp: admin.app(),
43+
adminApp: getApp(),
4544
},
4645
}
4746
})

playground/src/pages/app-check.vue

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
<script lang="ts" setup>
2-
import { useAppCheckToken } from 'vuefire'
2+
import { getToken } from 'firebase/app-check'
3+
import { onMounted } from 'vue'
4+
import { useAppCheckToken, useAppCheck } from 'vuefire'
35
46
const token = useAppCheckToken()
7+
const appCheck = useAppCheck()
8+
9+
onMounted(async () => {
10+
// console.log(await getToken(appCheck))
11+
})
512
</script>
613

714
<template>

src/app-check/index.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import { FirebaseApp } from 'firebase/app'
22
import {
33
initializeAppCheck,
4-
AppCheckOptions,
54
onTokenChanged,
5+
AppCheckOptions,
6+
AppCheck,
7+
getToken,
8+
AppCheckTokenResult,
69
} from 'firebase/app-check'
710
import { App, inject, InjectionKey, Ref, ref } from 'vue-demi'
11+
import { useFirebaseApp } from '../app'
812
import { getGlobalScope } from '../globals'
913
import { isClient } from '../shared'
1014

src/server/app-check.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import type { app } from 'firebase-admin'
1+
import type { App as FirebaseAdminApp } from 'firebase-admin/app'
2+
import { getAppCheck } from 'firebase-admin/app-check'
23
import type { FirebaseApp } from 'firebase/app'
34
import { CustomProvider, initializeAppCheck } from 'firebase/app-check'
45

@@ -11,7 +12,7 @@ import { CustomProvider, initializeAppCheck } from 'firebase/app-check'
1112
* @param param2 options
1213
*/
1314
export function VueFireAppCheckServer(
14-
adminApp: app.App,
15+
adminApp: FirebaseAdminApp,
1516
firebaseApp: FirebaseApp,
1617
{
1718
// default to 1 week
@@ -20,11 +21,11 @@ export function VueFireAppCheckServer(
2021
ttlMillis?: number
2122
} = {}
2223
) {
24+
const appCheck = getAppCheck(adminApp)
2325
initializeAppCheck(firebaseApp, {
2426
provider: new CustomProvider({
2527
getToken: () =>
26-
adminApp
27-
.appCheck()
28+
appCheck
2829
// NOTE: appId is checked on the server plugin
2930
.createToken(firebaseApp.options.appId!, { ttlMillis })
3031
.then(({ token, ttlMillis: expireTimeMillis }) => ({

0 commit comments

Comments
 (0)