Я пытаюсь узнать, как реализовать аутентификацию с помощью Firebase в моем приложении nextjs. Первое, что мы делаем при использовании Firebase, — это инициализируем Firebase с нашей конфигурацией (apiKey и т. д.). Если я использую какую-либо функцию Firebase из клиентского компонента, она требует, чтобы эта конфигурация была отправлена клиенту, и я думаю, что нам никогда не следует этого делать?
https://firebase.google.com/codelabs/firebase-nextjs#5
Но в этом уроке Google они делают именно это? Они добавили к переменным .env префикс NEXT_PUBLIC_, что делает их доступными для клиентских компонентов? Может ли такая компания, как Google, создать неправильное руководство для своего продукта? Можно ли отправить мою конфигурацию Firebase. клиенту?
Если нет, то как я могу реализовать эту функциональность с помощью серверных компонентов. Я думаю, что для входа и выхода я могу вызвать действия сервера?
Чего я не могу сделать, так это как прослушивать состояние аутентификации и отображать пользовательский интерфейс в соответствии с этим (изменить кнопку входа в систему на кнопку выхода и т. д.)
Предположим, у меня есть навигационная панель серверного компонента:
function Navbar() {
let signedIn = false;
auth.onAuthStateChanged((authUser) => {
if (authUser) {
signedIn = true;
}
});
return (
signedIn ? <SignOutButton /> : <SignInButton />
)
}
Я не могу использовать состояние или useEffect на серверном компоненте, и я не знаю, будет ли уместно объявлять обычную переменную, подобную этой?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


пожалуйста, пройдите ниже
вот так типичная конфигурация. файл выглядит как
import firebase from 'firebase/app';
import 'firebase/auth';
const firebaseConfig = {
apiKey: 'YOUR_API_KEY',
authDomain: 'YOUR_AUTH_DOMAIN',
projectId: 'YOUR_PROJECT_ID',
storageBucket: 'YOUR_STORAGE_BUCKET',
messagingSenderId: 'YOUR_MESSAGING_SENDER_ID',
appId: 'YOUR_APP_ID',
};
if (!firebase.apps.length) {
firebase.initializeApp(firebaseConfig);
}
вы, должно быть, беспокоитесь в основном о том, чтобы открыть общедоступный ключ API. поэтому прочитайте об этом ниже.
(ссылка api-keys#general-info)
Ключи API для Firebase отличаются от типичных ключей API.
В отличие от обычного использования ключей API, ключи API для сервисов Firebase не используются для контроля доступа к серверным ресурсам; это может быть только сделано с помощью правил безопасности Firebase (чтобы контролировать, какие пользователи могут получить доступ ресурсы) и Проверка приложений (чтобы контролировать, какие приложения могут получать доступ к ресурсам).
Обычно вам необходимо тщательно охранять ключи API (например, с помощью использование службы хранилища или установка ключей в качестве переменных среды); однако ключи API для сервисов Firebase можно включать в код или зарегистрированные файлы конфигурации.
Хотя ключи API для сервисов Firebase можно безопасно включать в код, есть несколько конкретных случаев, когда вам следует установить ограничения для вашего API-ключ; например, если вы используете Firebase ML, Firebase Аутентификация с использованием метода входа по электронной почте/паролю или с использованием оплачиваемого метода входа. Google Cloud API. Подробнее об этих случаях читайте далее на этой странице.
также пройдите безопасно ли выставлять Firebase-apikey на всеобщее обозрение
если вы понимаете, как используются и работают ключи API в вашем проекте Firebase, вы можете следовать остальной части импликации, как обычно.
например :
для входа в систему с Google:
const signInWithGoogle = async () => {
const provider = new firebase.auth.GoogleAuthProvider();
await firebase.auth().signInWithPopup(provider);
};
теперь с целью убедиться в статусе аутентификации пользователя (как вы подчеркнули). Вы можете использовать состояния подписки для изменений аутентификации. Чтобы подписаться на изменения аутентификации, выполните следующие действия:
Перейдите к файлу src/comComponents/Header.jsx. Замените функцию useUserSession следующим кодом:
function useUserSession(initialUser) {
// The initialUser comes from the server through a server component
const [user, setUser] = useState(initialUser);
const router = useRouter();
useEffect(() => {
const unsubscribe = onAuthStateChanged(authUser => {
setUser(authUser);
});
return () => {
unsubscribe();
};
}, []);
useEffect(() => {
onAuthStateChanged(authUser => {
if (user === undefined) return;
if (user?.email !== authUser?.email) {
router.refresh();
}
});
}, [user]);
return user;
}
для более подробной информации посетите ссылку: firebase-nextjs#5
спасибо, это большое облегчение. Однако Gemini от Google по-прежнему категорически не согласен с отправкой API-ключа Firebase клиенту. сейчас я перейду к клиентским компонентам
да, конечно, всегда лучше следовать строгим правилам безопасности в любой ситуации, поскольку они очень гибкие, поэтому вы всегда можете найти лучшее для вашей ситуации.
«Если я использую какую-либо функцию Firebase из клиентского компонента, для этого потребуется отправить эту конфигурацию клиенту, и я думаю, что нам никогда не следует этого делать?» См.: stackoverflow.com/questions/37482366/…