Простая аутентификация Firebase для всех стратегий рендеринга Next.js.
Этот пакет позволяет получить аутентифицированного пользователя Firebase и токена идентификатора во время рендеринга на стороне клиента и сервера (SSR).
Мы рассматриваем Firebase JS SDK как источник истины для статуса автоза. Когда пользователь входит в систему, мы называем конечную точку, чтобы генерировать токен обновления и хранить информацию пользователя, токен идентификатора и токен обновления в файлах cookie. Будущие запросы на страницы SSR получают информацию пользователя и токен идентификатора от файлов cookie, обновляя токен идентификатора по мере необходимости. Когда пользователь выйдет в систему, мы не отгоняем файлы cookie.
Смотрите живую демонстрацию примера приложения.
В зависимости от потребностей вашего приложения, другие подходы могут работать лучше для вас.
Если ваше приложение использует только статические страницы или не нуждается в пользователе Firebase для SSR, используйте SDK Firebase JS непосредственно, чтобы загрузить пользователя на стороне клиента.
getServerSideProps .Если ваше приложение нуждается в пользователе Firebase для SSR (но не нуждается в стороне сервера токенов идентификатора) , вы можете рассмотреть один из этих подходов:
Если ваше приложение нуждается в обобщенном решении по аутентификации - не специально аутентификации Firebase - вы могли бы рассмотреть возможность использования NextAuth.js. NextAuth.js не использует аутентификацию Firebase, но поддерживает широкий спектр поставщиков идентификации, включая Google. Подробнее здесь о различиях между next-firebase-auth и NextAuth.js, чтобы увидеть, что лучше всего подходит для ваших нужд.
Если ваше приложение использует маршрутизатор приложения Next.js, этот пакет еще не поддерживает его. Вы можете следовать прогрессу в #568.
Этот пакет, вероятно, будет полезен, если вы ожидаете использовать как статические страницы, так и SSR, или если вам нужен доступ к стороне сервера Firebase Id Tokens.
Краткое примечание о том, что этот пакет не делает:
- Он не предоставляет пользовательский интерфейс аутентификации. Рассмотрим Firebaseui-Web или постройте свой собственный.
- Он не расширяет функциональность Firebase помимо предоставления универсального доступа к пользователю. Используйте Admin SDK Firebase и Firebase JS SDK для любых других потребностей.
Установить:
yarn add next-firebase-auth или npm i next-firebase-auth
Убедитесь, что зависимости от сверстников также установлены:
yarn add firebase firebase-admin next react react-dom
Создайте модуль для инициализации next-firebase-auth .
Для получения подробной информации см. Конфигурацию.
// ./initAuth.js
import { initializeApp } from 'firebase/app'
import { init } from 'next-firebase-auth'
const initAuth = ( ) => {
const firebaseClientInitConfig = {
apiKey : 'MyExampleAppAPIKey123' , // required
authDomain : 'my-example-app.firebaseapp.com' ,
databaseURL : 'https://my-example-app.firebaseio.com' ,
projectId : 'my-example-app-id' ,
}
initializeApp ( firebaseClientInitConfig )
init ( {
authPageURL : '/auth' ,
appPageURL : '/' ,
loginAPIEndpoint : '/api/login' ,
logoutAPIEndpoint : '/api/logout' ,
onLoginRequestError : ( err ) => {
console . error ( err )
} ,
onLogoutRequestError : ( err ) => {
console . error ( err )
} ,
firebaseAuthEmulatorHost : 'localhost:9099' ,
firebaseAdminInitConfig : {
credential : {
projectId : 'my-example-app-id' ,
clientEmail : '[email protected]' ,
// The private key must not be accessible on the client side.
privateKey : process . env . FIREBASE_PRIVATE_KEY ,
} ,
databaseURL : 'https://my-example-app.firebaseio.com' ,
} ,
// Use application default credentials (takes precedence over firebaseAdminInitConfig if set)
// useFirebaseAdminDefaultCredential: true,
firebaseClientInitConfig ,
// tenantId: 'example-tenant-id', // Optional, only necessary in multi-tenant configuration
cookies : {
name : 'ExampleApp' , // required
// Keys are required unless you set `signed` to `false`.
// The keys cannot be accessible on the client side.
keys : [
process . env . COOKIE_SECRET_CURRENT ,
process . env . COOKIE_SECRET_PREVIOUS ,
] ,
httpOnly : true ,
maxAge : 12 * 60 * 60 * 24 * 1000 , // twelve days
overwrite : true ,
path : '/' ,
sameSite : 'strict' ,
secure : true , // set this to false in local (non-HTTPS) development
signed : true ,
} ,
onVerifyTokenError : ( err ) => {
console . error ( err )
} ,
onTokenRefreshError : ( err ) => {
console . error ( err )
} ,
} )
}
export default initAuth Установите переменные частной среды FIREBASE_PRIVATE_KEY , COOKIE_SECRET_CURRENT и COOKIE_SECRET_PREVIOUS в .env.local . Если вы включили эмулятор аутентификации Firebase, вам также необходимо установить переменную среды FIREBASE_AUTH_EMULATOR_HOST .
Инициализируйте next-firebase-auth в _app.js :
// ./pages/_app.js
import initAuth from '../initAuth' // the module you created above
initAuth ( )
function MyApp ( { Component , pageProps } ) {
return < Component { ... pageProps } />
}
export default MyAppСоздать конечные точки API входа и входа в систему, которые устанавливают файлы cookie Auth:
// ./pages/api/login
import { setAuthCookies } from 'next-firebase-auth'
import initAuth from '../../initAuth' // the module you created above
initAuth ( )
const handler = async ( req , res ) => {
try {
await setAuthCookies ( req , res )
} catch ( e ) {
return res . status ( 500 ) . json ( { error : 'Unexpected error.' } )
}
return res . status ( 200 ) . json ( { success : true } )
}
export default handler // ./pages/api/logout
import { unsetAuthCookies } from 'next-firebase-auth'
import initAuth from '../../initAuth' // the module you created above
initAuth ( )
const handler = async ( req , res ) => {
try {
await unsetAuthCookies ( req , res )
} catch ( e ) {
return res . status ( 500 ) . json ( { error : 'Unexpected error.' } )
}
return res . status ( 200 ) . json ( { success : true } )
}
export default handlerНаконец, используйте аутентифицированного пользователя на странице:
// ./pages/demo
import React from 'react'
import {
useUser ,
withUser ,
withUserTokenSSR ,
} from 'next-firebase-auth'
const Demo = ( ) => {
const user = useUser ( )
return (
< div >
< p > Your email is { user . email ? user . email : 'unknown' } . </ p >
</ div >
)
}
// Note that this is a higher-order function.
export const getServerSideProps = withUserTokenSSR ( ) ( )
export default withUser ( ) ( Demo ) init(config) Инициализирует next-firebase-auth , взяв объект конфигурации.
withUser({ ...options })(PageComponent) Функция высшего порядка для предоставления User контекста компоненту. Используйте это на любой странице Next.js, которая будет получить доступ к пользователю аудитории через крючок useUser . Необязательно, он может перенаправить на стороне клиента на основе статуса авторов пользователя.
Он принимает следующие варианты:
| Вариант | Описание | По умолчанию |
|---|---|---|
whenAuthed | Действие, которое нужно предпринять, если пользователь аутентифицируется. Один из AuthAction.RENDER или AuthAction.REDIRECT_TO_APP . | AuthAction.RENDER |
whenAuthedBeforeRedirect | Действие, которое нужно предпринять в ожидании перенаправления браузера. Реально, когда пользователь аутентифицируется, и когда обойдется, установлен на authaction.redirect_to_app. Одно из: AuthAction.RENDER или AuthAction.SHOW_LOADER или AuthAction.RETURN_NULL . | AuthAction.RETURN_NULL |
whenUnauthedBeforeInit | Действие, которое нужно предпринять, если пользователь не будет аутентифицирован, но клиент Firebase JS SDK еще не инициализировался. Одно из: AuthAction.RENDER , AuthAction.REDIRECT_TO_LOGIN , AuthAction.SHOW_LOADER . | AuthAction.RENDER |
whenUnauthedAfterInit | Действие, которое необходимо предпринять, если пользователь не будет аутентифицирован, и клиент Firebase JS SDK уже инициализировался. Одно из: AuthAction.RENDER , AuthAction.REDIRECT_TO_LOGIN . | AuthAction.RENDER |
appPageURL | Перенаправление URL -адреса назначения, когда мы должны перенаправить в приложение. Pageurl. | config.appPageURL |
authPageURL | URL -адрес назначения перенаправления, когда мы должны перенаправить на страницу входа в систему. Pageurl. | config.authPageURL |
LoaderComponent | Компонент для рендеринга, когда пользователь не является повернутым, а whenUnauthedBeforeInit устанавливается на AuthAction.SHOW_LOADER . | нулевой |
Например, эта страница будет перенаправлена на страницу входа в систему, если пользователь не будет аутентифицирован:
import { withUser , AuthAction } from 'next-firebase-auth'
const DemoPage = ( ) => < div > My demo page </ div >
export default withUser ( {
whenUnauthedAfterInit : AuthAction . REDIRECT_TO_LOGIN ,
authPageURL : '/my-login-page/' ,
} ) ( DemoPage )Вот пример страницы входа, на которой показан загрузчик до тех пор, пока не будет инициализирована Firebase, затем перенаправлена в приложение, если пользователь уже вошел в систему:
import { withUser , AuthAction } from 'next-firebase-auth'
const MyLoader = ( ) => < div > Loading... </ div >
const LoginPage = ( ) => < div > My login page </ div >
export default withUser ( {
whenAuthed : AuthAction . REDIRECT_TO_APP ,
whenUnauthedBeforeInit : AuthAction . SHOW_LOADER ,
whenUnauthedAfterInit : AuthAction . RENDER ,
LoaderComponent : MyLoader ,
} ) ( LoginPage )Для использования TypeScript посмотрите здесь.
withUserTokenSSR({ ...options })(getServerSidePropsFunc = ({ user }) => {}) Функция более высокого порядка, которая завершает функцию getServerSideProps от GeterverSideProps от GeterverSideProps для предоставления User контекста. Необязательно, он может перенаправить на стороне сервера на основе статуса авторов пользователя. Обернутая функция не является обязательной; Если предоставлено, он будет вызван с context объектом, который содержит свойство user .
Он принимает следующие варианты:
| Вариант | Описание | По умолчанию |
|---|---|---|
whenAuthed | Действие, которое нужно предпринять, если пользователь аутентифицируется. Либо AuthAction.RENDER или AuthAction.REDIRECT_TO_APP . | AuthAction.RENDER |
whenUnauthed | Действие, которое нужно предпринять, если пользователь не будет аутентифицирован. Либо AuthAction.RENDER или AuthAction.REDIRECT_TO_LOGIN . | AuthAction.RENDER |
appPageURL | Перенаправление URL -адреса назначения, когда мы должны перенаправить в приложение. Pageurl. | config.appPageURL |
authPageURL | URL -адрес назначения перенаправления, когда мы должны перенаправить на страницу входа в систему. Pageurl. | config.authPageURL |
Например, эта страница будет SSR для аутентифицированных пользователей, привлечь репутации с использованием токена идентификатора Firebase и перенаправить на стороне на стороне сервера на страницу входа в систему, если пользователь не будет аутентифицирован:
import {
useUser ,
withUser ,
withUserTokenSSR ,
} from 'next-firebase-auth'
const DemoPage = ( { thing } ) => < div > The thing is: { thing } </ div >
export const getServerSideProps = withUserTokenSSR ( {
whenUnauthed : AuthAction . REDIRECT_TO_LOGIN ,
} ) ( async ( { user } ) => {
// Optionally, get other props.
const token = await user . getIdToken ( )
const response = await fetch ( '/api/my-endpoint' , {
method : 'GET' ,
headers : {
Authorization : token ,
} ,
} )
const data = await response . json ( )
return {
props : {
thing : data . thing ,
} ,
}
} )
export default withUser ( ) ( DemoPage ) withUserSSR({ ...options })(getServerSidePropsFunc = ({ user }) => {}) Ведет себя почти идентично с withUserTokenSSR , с одним из ключевых отличий: user не будет содержать токен идентификатора.
Этот метод опирается на аудируемые пользовательские данные из файла cookie, а не проверять или обновить токен идентификатора Firebase. Следовательно:
user предоставленный через контекст, будет разрешаться в NULL, когда вы звоните user.getIdToken() .withUserTokenSSR .withUserTokenSSR .cookies.signed устанавливается на false . Это является потенциальным риском безопасности, потому что клиентами могут быть изменены значения файлов cookie пользователя пользователей.
Это принимает те же варианты, что и у withUserTokenSSR .
useUser() Крюк, который возвращает текущего user . Чтобы использовать это, на странице Next.js должна быть обернута с withUser . Если пользователь не аутентифицирован, useUser вернет экземпляр User с помощью нулевого id .
Например:
import { useUser , withUser } from 'next-firebase-auth'
const Demo = ( ) => {
const user = useUser ( )
return (
< div >
< p > Your email is { user . email ? user . email : 'unknown' } . </ p >
</ div >
)
}
export default withUser ( ) ( Demo ) setAuthCookies(req, res)Устанавливает файлы cookie для хранения информации о аутентифицированном пользователе. Назовите это из своей конечной точки API "Login".
Куки управляются с помощью cookies . Смотрите конфигурацию для вариантов cookie.
Аргументом req должен быть объектом запроса IncomingMessage / next.js. Аргумент res должен быть объектом ответа ServerResponse / next.js. Это требует, чтобы заголовок запроса Authorization был установлен в токен идентификатор пользователя Firebase, который этот пакет обрабатывает автоматически.
Это можно вызвать только на стороне сервера.
unsetAuthCookies(req, res)Отделы (истекают) Автомобильные файлы. Назовите это из своей конечной точки API "Logout".
Аргументом req должен быть объектом запроса IncomingMessage / next.js. Аргумент res должен быть объектом ответа ServerResponse / next.js.
Это можно вызвать только на стороне сервера.
verifyIdToken(token) => Promise<User> Проверяет токен идентификатора Firebase и решает экземпляр User . Это служит аналогичной целью, что и Admin SDK Firebase Admin SDK.
getUserFromCookies({ ...options })Добавлен в V1
Проверяет и возвращает user из Auth Cookie. Это альтернатива verifyIdToken , которая проверяет пользователя из токена идентификатора.
В целом, мы рекомендуем, чтобы конечные точки API использовали токен идентификатора, а не файлы cookie для идентификации пользователя, что позволяет избежать некоторых потенциальных уязвимостей CSRF. Тем не менее, этот метод будет полезен для конечных точек, должен полагаться исключительно на значения cookie, чтобы идентифицировать пользователя.
Это можно вызвать только на стороне сервера.
Смотрите этот пример для получения дополнительной информации об использовании этого в отдельной бэкэнд -среде за пределами Next.js.
Аргумент параметров может включать в себя:
Object - объект запроса IncomingMessage / next.js
Объект запроса, значение заголовка cookie , для проверки пользователя будет использоваться. Требуется либо значение req , либо authCookieValue .
Boolean
Должен ли возвращенный пользователь включать токен идентификатора Firebase. По умолчанию к истинному. Когда это правда, поведение следует за поведением withUserTokenSSR ; Когда ложь, это следует за тем, как withUserSSR . Узнайте больше о различии в документах для Withuserssr.
String
В качестве альтернативы предоставлению объекта req , вы можете напрямую предоставить значение для использования Auth Fulte. Например, если ваш автозаправочный файл назван MyAuth , вы бы предоставили бы ценность cookie MyAuth.AuthUser (если includeToken неверно) или MyAuth.AuthUserTokens (если includeToken это правда).
Требуется либо значение req , либо authCookieValue .
String
Значение подписи Authipe Cookie, при использовании подписанных файлов cookie. Например, если ваш авторитетный cookie назван MyAuth , вы бы предоставили бы ценность cookie MyAuth.AuthUser.sig (если includeToken неверно) или MyAuth.AuthUserTokens.sig (если includeToken это правда).
AuthAction Объект, который определяет варианты рендеринга/перенаправления для withUser и withUserTokenSSR . Смотрите Authaction.
См. Пример конфигурации здесь. Предоставьте конфигурацию при вызове init .
String|Function|Object - страница
URL -адрес по умолчанию перейти к тому, когда withUser или withUserTokenSSR необходимо перенаправить для входа в систему. Необязательно, если не используется действие AuthAction.REDIRECT_TO_LOGIN auth.
String|Function|Object - страница
URL -адрес по умолчанию перейти к тому, когда withUser или withUserTokenSSR необходимо перенаправить в приложение. Необязательно, если только не используется действие AuthAction.REDIRECT_TO_APP auth.
String
Конечная точка API этот модуль вызовет, когда состояние аутентичного пользователя Firebase будет изменено.
String
Конечная точка API этот модуль вызовет, когда состояние автоэнергии изменяется для пользователя Firebase неаутентированного.
Function (необязательно)
Обработчик вызвал, если конечная точка входа в систему возвращает ответ без 200. Если обработчик не определен, эта библиотека добавит какие-либо не 200 ответов.
Не используется или не разрешено, если установлен обычай tokenChangedHandler .
Function (необязательно)
Обработчик вызвал, если конечная точка API входа возвращает ответ без 200. Если обработчик не определен, эта библиотека добавит какие-либо не 200 ответов.
Не используется или не разрешено, если установлен обычай tokenChangedHandler .
Function
Обратный вызов, который работает при изменении состояния авторитета для конкретного пользователя. Используйте это, если вы хотите настроить, как ваше приложение на стороне клиента вызывает ваши конечные точки API входа/входа в систему (например, для использования пользовательского Fetcher или добавления пользовательских заголовков). tokenChangedHandler получает User в качестве аргумента и вызывается, когда изменяется токен идентификатора пользователя, аналогично событию Firebase onIdTokenChanged .
Если указан этот обратный вызов, пользователь несет ответственность за:
Смотрите обработчик по умолчанию для руководства.
String
Хост и порт для местного эмулятора автофирной базы. Если это значение установлено, эмулятор Auth будет инициализирован с предоставленным хостом и портом.
Необходимо соответствовать значению переменной среды FIREBASE_AUTH_EMULATOR_HOST , например, localhost:9099 .
Object
Конфигурация передана в firebase-admin 's initializeApp . Он должен содержать свойство credential (простой объект) и свойство databaseURL . Требуется , если вы не инициализируете firebase-admin самостоятельно, прежде чем инициализация next-firebase-auth .
firebaseAdminInitConfig.credential.privateKey не может быть определен на стороне клиента и должен жить в секретной переменной среды.
Используете Vercel? См. Добавление закрытого ключа в Vercel для руководства.
Boolean
Когда True True, firebase-admin неявно найдет вашу учетную запись обслуживания среды хостинга во время initializeApp . Это применимо как для Firebase, так и для Google Cloud Platform, и рекомендуется для добавления ключа учетной записи службы в код через путь файла или прямое значение.
ПРИМЕЧАНИЕ . Для установки firebase-admin , либо firebaseAdminInitConfig , либо useFirebaseAdminDefaultCredential . Использование учетных данных по умолчанию будет переопределять значения, передаваемые firebaseAdminInitConfig.credential , если оба представлены.
Object
Конфигурация, соответствующая Firebase JS SDK initializeApp . firebaseClientInitConfig.apiKey всегда требуется . Мы рекомендуем инициализацию клиента Firebase SDK до того, как инициализация next-firebase-auth ; Тем не менее, next-firebase-auth попытается инициализировать Firebase, если приложения Firebase еще не существует.
Object
Настройки, используемые для авто печенья. Мы используем cookies для управления файлами cookie.
Свойства включают:
name : Используется MyExample.AuthUserTokens.sig качестве базы для имен cookie: если name установлено на «myExample MyExample.AuthUser.sig , файлы cookie будут названы MyExample.AuthUser и MyExample.AuthUserTokens . Необходимый.keys : массив струн, которые будут использоваться для подписи файлов cookie; Например, ['xD$WVv3qrP3ywY', '2x6#msoUeNhVHr'] . Поскольку эти строки являются секретами, предоставляйте их через секретную среду переменные, такие как [ process.env.COOKIE_SECRET_CURRENT, process.env.COOKIE_SECRET_PREVIOUS ] . Массив keys передается в конструктор Keygrip, как описано в пакете cookies . Требуется , если не signed установлено на false .cookies.set . Значение keys не может быть определена на стороне клиента и должно жить в секретной переменной среды.
Для безопасности значение maxAge должно быть две недели или меньше. Обратите внимание, что maxAge определяется в миллисекундах.
ПРИМЕЧАНИЕ. Срок действия файлов cookie будет продлена автоматически, когда пользователь загружает Firebase JS SDK.
Firebase JS SDK является источником истины для аутентификации, поэтому, если срок действия файлов cookie истекает, но пользователь по -прежнему работает с помощью Firebase, файлы cookie будут автоматически установлены снова, когда пользователь загружает Firebase JS SDK, но пользователь не будет вычисляться во время SSR по этому первому запросу.
Function (необязательно)
Обработчик ошибок, который будет вызван, если есть неожиданная ошибка при проверке токеновой стороны идентификатора пользователя. Он получит ошибку автофирной базы.
Эта библиотека не будет бросить, когда не может проверить токен идентификатора. Вместо этого он предоставит несаутонированному пользователю приложению. Обычно он обрабатывает общие ошибки, связанные с AUTH, такие как auth/id-token-expired и auth/user-disabled без броска. Смотрите #366 и #174 для дополнительного фона.
Function (необязательно)
Обработчик ошибок, который будет вызван, если есть неожиданная ошибка, обновляя сторону сервера идентификатора пользователя.
Эта библиотека не будет бросить, когда не может освежить токен идентификатора. Вместо этого он предоставит несаутонированному пользователю приложению. Смотрите #366 и #174 для дополнительного фона.
Определяет действия, которые необходимо предпринять в зависимости от статуса авторов пользователя, используя следующие константы:
AuthAction.RENDER : рендеринг дочернего компонента
AuthAction.SHOW_LOADER : показать компонент загрузчика
AuthAction.RETURN_NULL : вернуть NULL вместо любого компонента
AuthAction.REDIRECT_TO_LOGIN : перенаправление на страницу входа в систему
AuthAction.REDIRECT_TO_APP : перенаправить в приложение
Пользовательский объект используется в контекстах на стороне сервера и на стороне клиента. Это нормализованное представление пользователя Firebase.
ID - String|null
Идентификатор пользователя Firebase или NULL, если пользователь не является аутентификацией.
Электронная почта - String|null
Адрес электронной почты пользователя Firebase или NULL, если у пользователя нет адреса электронной почты.
Электронная почта - Boolean
Проверен ли адрес электронной почты пользователя.
Phonenumber - String|null
Добавлено в V0.13.1
Номер телефона пользователя Firebase или NULL, если у пользователя нет номера телефона.
DisplayName - String|null
Добавлено в V0.13.1
Отображающее имя пользователя Firebase или NULL, если у пользователя нет имени отображения.
Photourl - String|null
Добавлено в V0.13.1
URL -адрес фотографии пользователя Firebase или NULL, если у пользователя нет URL -адреса.
претензии - Object
Добавлено в V0.13.0
Любые пользовательские претензии Firebase.
getIdtoken - Function => Promise<String|null>
Асинхронная функция, которая решается до действительной строки токена идентификатора Firebase, или NULL, если нет достоверного токена.
ClientInitialized - Boolean
Инициализировал ли Firebase JS SDK. Если true , мы больше не используем информацию о пользователе из репутации на стороне сервера.
Firebaseuser - FirebaseUser |null
Пользователь из Firebase JS SDK, если он был инициализирован. В противном случае, нулевой.
Подпись - Function => Promise<void>
Метод, который называет signOut Firebase, если SDK Firebase JS был инициализирован. Если SDK не был инициализирован, этот метод не является OP.
String|Function|Object
Используемый в appPageURL и authPageURL в компонентах конфигурации и высшего порядка, PageURL определяет URL или путь перенаправления назначения.
Это может быть строка: /my-url/here/
Или объект:
{
destination : '/my-url/here/' , // Required string: the URL destination of a redirect
basePath : false , // whether to use the Next.js base path.
} Или функция, которая получает { ctx, user } и возвращает строку или redirectObject:
const redirect = ( { ctx , user } ) => {
// any custom logic here
return `/my-url/here/?username= ${ user . displayName } `
} ctx является значением контекста Next.js, если сервер или неопределенная, если клиентская сторона.
Смотрите примеры.md.
Застрявший? Поиск дискуссий или открывайте собственное обсуждение вопросов и ответов, описывающее, что вы уже пробовали.
Вот несколько начальных шагов, которые вы можете предпринять для отладки проблем:
onVerifyTokenError и onTokenRefreshError в вашей конфигурации и проверьте любые журналы ошибок.debug: true в вашей конфигурации и прочитайте через серверные и клиентские журналы отладки для любых полезных сообщений.Мы ожидаем, что определенные чувствительные значения конфигурации будут фальшивыми на стороне клиента (см. Код проверки конфигурации). Это меры предосторожности, чтобы убедиться, что разработчики не случайно объединяют что -то вроде их личного ключа Firebase с клиентом JS.
Чтобы исправить это, убедитесь, что настройка конфигурации undefined на стороне клиента, зарегистрировав его в консоли браузера. Вы можете использовать поддержку следующего .env для установки переменных только для сервера. Никогда не используйте префикс NEXT_PUBLIC* для каких -либо секретных значений.
Этот пакет позвонит в конечную точку Google, когда ему необходимо обновить сторону сервера токенов. Вы видите ошибку из этого запроса.
Чтобы исправить это, подтвердите, что ваш firebaseAdminInitConfig.credential.clientEmail является правильным. Это должно быть электронное письмо в сочетании с вашим частным ключом Firebase.
Если это не помогает, попробуйте проверить пользовательский токен, чтобы вручную проверить значения и структуру. Некоторые люди сталкиваются с этой проблемой, когда время их сервера неверно.
withUserTokenSSR , но клиентская авторитет работает.Если Auth работает на стороне клиента, но не на стороне сервера, Auth Cookie, скорее всего, не установлены.
Чтобы исправить это, подтвердите, что Auth Cookie устанавливаются в инструментах DEV вашего браузера. Если они не установлены, пожалуйста, проверьте, что параметры secure , sameSite и path , передаваемые в конфигурации next-firebase-auth имеют смысл для вашей среды. Например, если вы тестируете на Localhost, не HTTPS, убедитесь, что secure неверно.
Кроме того, пожалуйста, дважды проверьте журналы вашего сервера для любых ошибок, чтобы убедиться, что приложение Admin Admin Firebase правильно инициализация.
Часто это вызвано неправильным электронным письмом в учетных данных Firebase. Пожалуйста, убедитесь, что электронное письмо верно и из той же учетной записи Firebase, что и ваш закрытый ключ, или попробуйте генерировать новый ключ: https://firebase.google.com/docs/admin/setup
Вы можете попробовать настройку своих учетных данных в примере примера, чтобы убедиться, что код приложения не является проблемой.
В локальной разработке попробуйте очистить данные/файлы cookie для localhost , если вы ранее подписались с другой учетной записью Firebase, и у вас все еще есть авторитетные файлы cookie, подписанные другим закрытым ключом.
Вы также можете попробовать отключить эмулятор аутентификации Firebase. Удалите firebaseAuthEmulatorHost из вашей конфигурации и удалите FIREBASE_AUTH_EMULATOR_HOST из вашего файла .env .
См. Добавление закрытого ключа в Vercel и это обсуждение форматирования личного ключа.
Мы ожидаем, что некоторые приложения понадобятся некоторые функции, которые в настоящее время недоступны:
Мы хотели бы услышать ваши отзывы об этих или других функциях. Пожалуйста, не стесняйтесь открыть дискуссию!
Мы приветствуем вклад! Пожалуйста, посмотрите, как документы, чтобы начать работу.