Аутентификация Firebase в Nextjs с серверными компонентами

Я пытаюсь узнать, как реализовать аутентификацию с помощью 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 на серверном компоненте, и я не знаю, будет ли уместно объявлять обычную переменную, подобную этой?

«Если я использую какую-либо функцию Firebase из клиентского компонента, для этого потребуется отправить эту конфигурацию клиенту, и я думаю, что нам никогда не следует этого делать?» См.: stackoverflow.com/questions/37482366/…

Frank van Puffelen 17.02.2024 16:21
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
884
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

пожалуйста, пройдите ниже

вот так типичная конфигурация. файл выглядит как

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 клиенту. сейчас я перейду к клиентским компонентам

MWW 17.02.2024 11:12

да, конечно, всегда лучше следовать строгим правилам безопасности в любой ситуации, поскольку они очень гибкие, поэтому вы всегда можете найти лучшее для вашей ситуации.

Rainy sidewalks 17.02.2024 12:21

Другие вопросы по теме