gladly-team / next-firebase-auth

Simple Firebase authentication for all Next.js rendering strategies
https://nfa-example-git-v1x-gladly-team.vercel.app/
MIT License
1.34k stars 291 forks source link

Firebase client initialization error when using firebase 9.17.1 (latest) #614

Closed joeyscarim closed 7 months ago

joeyscarim commented 1 year ago

When filing a bug report, please confirm you've done the following:

  1. Have you set onVerifyTokenError and onTokenRefreshError in your config and checked for any helpful errors? Yes

  2. Have you set debug: true in your config and read through server-side and client-side debug logs for any helpful messages? Yes

  3. Have you tried the example app with your own Firebase credentials? Yes, see below for how I reproduced this using the canary example

  4. Have you read through the troubleshooting Q&A? Yes

Describe the bug When using the client side firebase as shown in the examples in the readme i.e. getFirestore(getApp()) with the latest version of firebase 9.17.1 the error FirebaseError: Firebase: Need to provide options, when not being deployed to hosting via source. (app/no-options). appears.

Seems to be an initialization error because doing my own client side initialization instead, like the example here https://github.com/shadeemerhi/reddit-clone-yt/blob/main/src/firebase/clientApp.ts, works as expected.

Versions next-firebase-auth version: 1.0.0-canary.19 Firebase JS SDK: 9.17.1 Next.js: 12.2.3 (also experienced same issue in my next@13.1.6 project)

To Reproduce Steps to reproduce the behavior:

Expected behavior Expected the client to be initialized and getFirestore to work, like with previous version of firebase and in the example at https://github.com/gladly-team/next-firebase-auth#using-the-firebase-apps

Debug and error logs Please provide debug logs or errors from onVerifyTokenError and onTokenRefreshError. Not relevant

Additional context Add any other context about the problem here. Thank you for any help/explanations!

spife129 commented 1 year ago

The current version doesn't work with firebase ver > 9.*, you will have to stick with ver 8.9 at the moment. I run into similar issue where the error says firebase.apps is undefined as in ver 9 it uses getApps() but the current lib still uses firebase.apps.

kmjennison commented 1 year ago

@spife129 That is not correct. The canary version of next-firebase-auth supports Firebase JS SDK v9. Please see README for more info.

kmjennison commented 1 year ago

@joeyscarim You mention that your app worked prior to upgrading Firebase to 9.17.1. What was the version of Firebase that worked? I'm wondering if this is a Firebase bug. Possibly related: #612

spife129 commented 1 year ago

@spife129 That is not correct. The canary version of next-firebase-auth supports Firebase JS SDK v9. Please see README for more info.

As you said, it's the canary version, are you saying we should use canary for production? It's the fact that the current version is not working with the ver 9. Please consider the use of words before you reply.

kmjennison commented 1 year ago

@spife129 That's fair. The current canary version will likely see some API changes before v1.x (see roadmap), but it's intended to be usable in production. Of course, each developer should evaluate what makes sense for their production app.

Regardless, this issue specifically references using the canary version with latest Firebase, which should work just fine. I don't want other readers to think those are incompatible, so I'm going to hide these comments as off-topic to this issue.

spife129 commented 1 year ago

Maybe make a note at the readme section that talks about upgrading to ver 9? So it's much easier for people to understand which version works. Thanks

joeyscarim commented 1 year ago

@kmjennison The version of firebase i was using was 9.16.0, which was working with next-firebase-auth 1.0.0-canary.18 as expected and as the examples in the docs show. the example in the repo which uses 9.9.1 works as well.

my confusion on it being a firebase bug or a next-firebase-auth bug is when i initialize firebase myself (doing it the exact same way as here: https://github.com/shadeemerhi/reddit-clone-yt/blob/main/src/firebase/clientApp.ts), prior to next-firebase-auth init, it works with the latest firebase version, 9.17.1

kmjennison commented 1 year ago

@joeyscarim Interesting. Looking at that example, one difference is the call to getFirestore outside of the component render. What happens if you try that pattern?

import { getApp } from 'firebase/app'
import { getFirestore } from 'firebase/firestore'

const firestore = getFirestore(getApp())

// component below or in another module

Possibly related StackOverflow post: https://stackoverflow.com/a/74732162/1332513

wongww commented 1 year ago

I've been using functions like getApp() and getAuth() inside a useEffect() hook.

I don't know if that's a "good" of way of accessing the firebase app, but so far that's the only way I've gotten it to work. Ideally, I would like to have access to the firebase before rendering the component.

Correct me if I'm wrong @kmjennison, but it's expected that getApp() returns nothing if it's not called in a useEffect() hook?

kmjennison commented 1 year ago

@wongww That isn't the behavior I'd expect based on the docs on getApp:

When called with no arguments, the default app is returned. When an app name is provided, the app corresponding to that name is returned.

An exception is thrown if the app being retrieved has not yet been initialized.

mrnguyentrantam commented 1 year ago

Hello, I encountered the same issue when using firebase 9.17 version, works well after downgrading to 9.16. Maybe firebase change the way they init internally @kmjennison

mkilp commented 1 year ago

Having the same exact issue. I am on firebase 9.16.0 and "next-firebase-auth": "1.0.0-canary.18". Downgrading both does not seem to work for me at all.

wongww commented 1 year ago

@kmjennison I've been calling functions like getApp() in a useEffect hook because I discovered that if I didn't, then getApp() would be called before the initAuth() function is finished (at least that's how I interpreted it :) ). In other words, getApp() was always throwing this initialization error before the component I call it in is finished mounting. Any thoughts on this flow? Would this be something you expected?

kmjennison commented 1 year ago

@wongww I'm not sure what you're running into. You might double-check a few things:

The example calls uses getApp outside of useEffect without a problem: https://github.com/gladly-team/next-firebase-auth/blob/80e5830661bfb21e87e33fc0174abf0cf47ce4e7/example/components/FirebaseAuth.js#L45

FabianRueckert commented 1 year ago

I am getting the same error, even if I call

initAuth();
export const auth = getAuth(getApp());

in _app.tsx right behind each other. And also when calling getAuth(getApp()) inside a component on the client side. Both on firebase 9.16.0 and 9.17.1.

Debug console also shows that next-firebase-auth has initialized right before. image

mkilp commented 1 year ago

I solved my issue - i've been importing getApp() from firebase js vs from firebase-admin (which is initialized).

martingouy commented 1 year ago

FWIW I am having the same issue. Downgrading to 9.16.0 fixed it

ancashoria commented 1 year ago

Same here, downgrading to 9.16.0 didn't fix it

ellisdod commented 1 year ago

I'm getting the same issue. In my case the init() function doesn't seem to be initializing a FirebaseApp instance that can be recognised by future getApp() calls. Calling getApps() within the initAuth file returns an empty array.

Downgrading to 9.9.1 fixed it.

Screenshot 2023-03-29 at 16 52 51 Screenshot 2023-03-29 at 16 53 13
ZhuBoao commented 1 year ago

On client side, Downgrading to 9.9.1 can fix it. But I still cannot get correct response from getApps() or getApp() from server side. I am sure I called initAuth() on the top of the API.

rafaeldcf commented 1 year ago

This is my workaround until a real fix. I´m using firebase 9.19.1 and next-firebase-auth 1.0.0-canary.19

Configure firebase credential in .env.local file to avoid errors duplicating data

NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
NEXT_PUBLIC_FIREBASE_DATABASE_URL=
NEXT_PUBLIC_FIREBASE_PROJECT_ID=

Add this code:

import { initializeApp } from "firebase/app";
const firebaseConfig = {
  apiKey: process.env.NEXT_PUBLIC_FIREBASE_PUBLIC_API_KEY,
  authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
  projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
};

try {
  const app = initializeApp(firebaseConfig);
} catch (err) {
  console.error(err);
}
EvertonMJunior commented 1 year ago

This is my workaround until a real fix. I´m using firebase 9.19.1 and next-firebase-auth 1.0.0-canary.19

Configure firebase credential in .env.local file to avoid errors duplicating data

NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
NEXT_PUBLIC_FIREBASE_DATABASE_URL=
NEXT_PUBLIC_FIREBASE_PROJECT_ID=

Add this code:

import { initializeApp } from "firebase/app";
const firebaseConfig = {
  apiKey: process.env.NEXT_PUBLIC_FIREBASE_PUBLIC_API_KEY,
  authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
  projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
};

try {
  const app = initializeApp(firebaseConfig);
} catch (err) {
  console.error(err);
}

This solved it for me. I added the initialization right after the init() command. The issue arose to me when I upgraded to Next 13.

cookrn commented 1 year ago

Should an issue be opened against firebase/firebase-js-sdk or does it seem like the bug might be in this package?

kmjennison commented 1 year ago

I haven't had a chance to investigate whether this is a Firebase bug or something in this package. Help welcome!

I reproduced the problem in the example app here, and in that case, it worked when pinning the Firebase client SDK to version 9.16.0.

cookrn commented 1 year ago

When I reproduced in a project yesterday, downgrading to 9.16.0 also fixed. I was not able to see any errors in the browser console or server logs when using 9.17.x and above, which was odd.

steebchen commented 1 year ago

Running into this just on firebase hosting/functions (with experimental web frameworks nextj support), it seems to work on vercel. Not sure if it's the same issue. Everything works on the client, but the server app doesn't get initialized.

# getting this just on firebase functions:
FirebaseAppError: The default Firebase app does not exist. Make sure you call initializeApp() before using any of the Firebase services

I am on:

    "firebase": "9.16.0",
    "firebase-admin": "11.8.0",
    "firebase-tools": "12.4.0",
steebchen commented 1 year ago

Actually I'm also running randomly into this on vercel now 😭

I'm using firebase@9.16.0 so it doesn't necessarily seem to be related to this version I think?

errorInfo: {
    code: 'app/no-app',
    message: 'The default Firebase app does not exist. Make sure you call initializeApp() before using any of the Firebase services.'
  },
kmjennison commented 1 year ago

This appears to be fixed in firebase ^9.18.0 and 10.0.0. Let me know if you run into the issue again after upgrading!

kmjennison commented 1 year ago

Never mind: these versions worked in development but not after building.

kmjennison commented 1 year ago

Here's the diff in the Firebase JS SDK between the working and broken versions: https://github.com/firebase/firebase-js-sdk/compare/firebase@9.16.0..firebase@9.17.0

kmjennison commented 1 year ago

Possible areas of interest:

kmjennison commented 1 year ago

Possibly related? This might be affecting our Webpack bundle / webpack-node-externals.

Issue: https://github.com/firebase/firebase-js-sdk/issues/7005

Fix: https://github.com/firebase/firebase-js-sdk/pull/7007

Mrjuanblack commented 9 months ago

@steebchen Were you able to find a workaround? I'm also using firebase functions but I ran into the same issue as you.

steebchen commented 9 months ago

Not really, I stayed on 9.16.0 on Vercel, which seems to work fine (on firebase hosting I run into different issue)

kmjennison commented 7 months ago

I've updated the docs and example app to recommend initializing the Firebase JS SDK in your app prior to initializing next-firebase-auth, which avoids this issue.