Authentification simple de la base de feu pour toutes les stratégies de rendu Next.js.
Ce package permet de faire en sorte que l'utilisateur Firebase et le jeton ID authentifié pendant le rendu (SSR) côté client et côté serveur (SSR).
Nous traitons le SDK Firebase JS comme la source de la vérité pour le statut d'automne. Lorsque l'utilisateur se connecte, nous appelons un point de terminaison pour générer un jeton de rafraîchissement et stocker les informations d'utilisateur, le jeton ID et le jeton de rafraîchissement dans les cookies. Les demandes futures aux pages SSR reçoivent les informations utilisateur et le jeton ID des cookies, rafraîchissant le jeton ID au besoin. Lorsque l'utilisateur se déconnecte, nous détendons les cookies.
Voir une démo en direct de l'exemple d'application.
Selon les besoins de votre application, d'autres approches pourraient mieux fonctionner pour vous.
Si votre application utilise uniquement des pages statiques ou n'a pas besoin de l'utilisateur Firebase pour SSR, utilisez directement le SDK JS Firebase pour charger l'utilisateur du côté client.
getServerSideProps .Si votre application a besoin de l'utilisateur Firebase pour SSR (mais n'a pas besoin du côté serveur de jeton ID) , vous pouvez considérer l'une de ces approches:
Si votre application a besoin d'une solution d'authentification généralisée - pas spécifiquement l'authentification des bases de feu - vous pourriez envisager d'utiliser NextAuth.js. NextAuth.js n'utilise pas d'authentification Firebase mais prend en charge une grande variété de fournisseurs d'identité, y compris Google. En savoir plus ici sur les différences entre next-firebase-auth et NextAuth.js pour voir ce qui fonctionne le mieux pour vos besoins.
Si votre application utilise le routeur d'application de next.js, ce package ne le prend pas encore en charge. Vous pouvez suivre les progrès du # 568.
Ce package sera probablement utile si vous vous attendez à utiliser à la fois les pages statiques et SSR ou si vous avez besoin d'accéder au côté serveur de jetons ID Firebase.
Une note rapide sur ce que ce package ne fait pas :
- Il ne fournit pas d'interface utilisateur d'authentification. Considérez Firebaseui-Web ou construisez le vôtre.
- Il n'étend pas les fonctionnalités de base de feu au-delà de l'accès universel à l'utilisateur autoritaire. Utilisez le SDK Firebase Admin et Firebase JS pour tout autre besoin.
Installer:
yarn add next-firebase-auth ou npm i next-firebase-auth
Assurez-vous que les dépendances par les pairs sont également installées:
yarn add firebase firebase-admin next react react-dom
Créez un module pour initialiser next-firebase-auth .
Voir la documentation de configuration pour plus de détails
// ./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 Définissez les variables d'environnement privées FIREBASE_PRIVATE_KEY , COOKIE_SECRET_CURRENT et COOKIE_SECRET_PREVIOUS dans .env.local . Si vous avez activé l'émulateur d'authentification Firebase, vous devrez également définir la variable d'environnement FIREBASE_AUTH_EMULATOR_HOST .
Initialisez next-firebase-auth dans _app.js :
// ./pages/_app.js
import initAuth from '../initAuth' // the module you created above
initAuth ( )
function MyApp ( { Component , pageProps } ) {
return < Component { ... pageProps } />
}
export default MyAppCréer des points de terminaison de connexion et de déconnexion de l'API qui définissent les cookies 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 handlerEnfin, utilisez l'utilisateur authentifié dans une page:
// ./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) Initialise next-firebase-auth , en prenant un objet config.
withUser({ ...options })(PageComponent) Une fonction d'ordre supérieur pour fournir le contexte User à un composant. Utilisez-le avec n'importe quelle page Next.js qui accédera à l'utilisateur autoritaire via le crochet useUser . Facultativement, il peut être redirigé côté client en fonction de l'état de l'authentification de l'utilisateur.
Il accepte les options suivantes:
| Option | Description | Défaut |
|---|---|---|
whenAuthed | L'action à prendre si l'utilisateur est authentifié. L'un de AuthAction.RENDER ou AuthAction.REDIRECT_TO_APP . | AuthAction.RENDER |
whenAuthedBeforeRedirect | L'action à prendre en attendant que le navigateur soit redirigé. Pertinent lorsque l'utilisateur est authentifié et lorsque le moment est venu sur authaction.redirect_to_app. L'un des: AuthAction.RENDER ou AuthAction.SHOW_LOADER ou AuthAction.RETURN_NULL . | AuthAction.RETURN_NULL |
whenUnauthedBeforeInit | L'action à prendre si l'utilisateur n'est pas authentifié mais que le SDK du client Firebase n'a pas encore initialisé. L'un des: AuthAction.RENDER , AuthAction.REDIRECT_TO_LOGIN , AuthAction.SHOW_LOADER . | AuthAction.RENDER |
whenUnauthedAfterInit | L'action à prendre si l'utilisateur n'est pas authentifié et que le SDK du client Firebase a déjà initialisé. L'un des: AuthAction.RENDER , AuthAction.REDIRECT_TO_LOGIN . | AuthAction.RENDER |
appPageURL | L'URL de destination de redirection lorsque nous devons rediriger vers l'application. Une pageurl. | config.appPageURL |
authPageURL | L'URL de destination de redirection lorsque nous devons rediriger vers la page de connexion. Une pageurl. | config.authPageURL |
LoaderComponent | Le composant à rendu lorsque l'utilisateur n'est pas autorisé et whenUnauthedBeforeInit il est défini sur AuthAction.SHOW_LOADER . | nul |
Par exemple, cette page redirigera vers la page de connexion si l'utilisateur n'est pas authentifié:
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 )Voici un exemple de page de connexion qui montre un chargeur jusqu'à ce que Firebase soit initialisé, puis redirige vers l'application si l'utilisateur est déjà connecté:
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 )Pour l'utilisation dactylographiée, jetez un œil ici.
withUserTokenSSR({ ...options })(getServerSidePropsFunc = ({ user }) => {}) Une fonction d'ordre supérieur qui enveloppe une fonction getServerSideProps de Next.js Pages pour fournir le contexte User pendant le rendu côté serveur. Facultativement, il peut être redirigé côté serveur en fonction de l'état de l'authentification de l'utilisateur. Une fonction enveloppée est facultative; S'il est fourni, il sera appelé avec un objet context qui contient une propriété user .
Il accepte les options suivantes:
| Option | Description | Défaut |
|---|---|---|
whenAuthed | L'action à prendre si l'utilisateur est authentifié. AuthAction.RENDER ou AuthAction.REDIRECT_TO_APP . | AuthAction.RENDER |
whenUnauthed | L'action à prendre si l'utilisateur n'est pas authentifié. AuthAction.RENDER ou AuthAction.REDIRECT_TO_LOGIN . | AuthAction.RENDER |
appPageURL | L'URL de destination de redirection lorsque nous devons rediriger vers l'application. Une pageurl. | config.appPageURL |
authPageURL | L'URL de destination de redirection lorsque nous devons rediriger vers la page de connexion. Une pageurl. | config.authPageURL |
Par exemple, cette page sera SSR pour les utilisateurs authentifiés, récupérant les accessoires à l'aide de leur jeton ID Firebase, et sera redirigé vers le serveur vers la page de connexion si l'utilisateur n'est pas authentifié:
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 }) => {}) Se comporte presque identique à withUserTokenSSR , avec une différence clé: l' user ne contiendra pas de jeton ID.
Cette méthode repose sur des données utilisateur autoritaires à partir d'un cookie plutôt que de vérifier ou de rafraîchir un jeton ID Firebase. Par conséquent:
user fourni via le contexte se résoudra à NULL lorsque vous appelez user.getIdToken() .withUserTokenSSR .withUserTokenSSR .cookies.signed sont définis sur false . Cela est un risque de sécurité potentiel, car les valeurs de cookie utilisateur autoritaire peuvent être modifiées par le client.
Cela prend les mêmes options que withUserTokenSSR .
useUser() Un crochet qui renvoie l' user actuel. Pour l'utiliser, la page suivante.js doit être enveloppée withUser . Si l'utilisateur n'est pas authentifié, useUser renvoie une instance User avec un id NULL.
Par exemple:
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)Définit les cookies pour stocker les informations de l'utilisateur authentifié. Appelez ceci à partir de votre point de terminaison de l'API "Connexion".
Les cookies sont gérés avec cookies . Voir la configuration pour les options de cookies.
L'argument req doit être un objet de demande IncomingMessage / next.js. L'argument res doit être un objet de réponse ServerResponse / next.js. Il exige que l'en-tête de la demande Authorization soit défini sur le jeton ID utilisateur Firebase, que ce package gère automatiquement.
Cela ne peut être appelé que du côté du serveur.
unsetAuthCookies(req, res)Net (expire) les cookies de l'authentification. Appelez ceci à partir de votre point de terminaison de l'API "déconnexion".
L'argument req doit être un objet de demande IncomingMessage / next.js. L'argument res doit être un objet de réponse ServerResponse / next.js.
Cela ne peut être appelé que du côté du serveur.
verifyIdToken(token) => Promise<User> Vérifie un jeton ID Firebase et se résout en instance User . Cela sert un objectif similaire à VerifyIdToken du SDK de Firebase Admin.
getUserFromCookies({ ...options })Ajouté dans V1
Vérifie et renvoie l' user des cookies. Il s'agit d'une alternative à verifyIdToken , qui vérifie l'utilisateur d'un jeton ID.
En général, nous recommandons que les points de terminaison API utilisent un jeton ID plutôt que les cookies pour identifier l'utilisateur, ce qui évite certaines vulnérabilités potentielles du CSRF. Cependant, cette méthode sera utile pour les points de terminaison doit s'appuyer exclusivement sur les valeurs de cookie pour identifier l'utilisateur.
Cela ne peut être appelé que du côté du serveur.
Voir cet exemple pour plus d'informations sur l'utilisation dans un environnement backend autonome en dehors de next.js.
L'argument des options peut inclure:
Object - Un objet de demande IncomingMessage
Un objet de demande dont la valeur d'en-tête cookie sera utilisée pour vérifier un utilisateur. Soit la valeur req ou authCookieValue sont nécessaires.
Boolean
Que l'utilisateur retourné ou non inclue un jeton ID de base de base. Par défaut est vrai. Lorsqu'il est vrai, le comportement suit celui de withUserTokenSSR ; Lorsqu'il est faux, il suit celui de withUserSSR . En savoir plus sur la distinction des documents pour WithUsSSR.
String
Comme alternative à la fourniture de l'objet req , vous pouvez directement fournir la valeur de cookie Auth à utiliser. Par exemple, si votre cookie Auth est nommé MyAuth , vous fournissez la valeur du cookie MyAuth.AuthUser (si includeToken est fausse) ou MyAuth.AuthUserTokens (si includeToken est vraie).
Soit la valeur req ou authCookieValue sont nécessaires.
String
La valeur de la signature du cookie Auth, si vous utilisez des cookies signés. Par exemple, si votre cookie Auth est nommé MyAuth , vous fournissez la valeur du cookie MyAuth.AuthUser.sig (si includeToken est fausse) ou MyAuth.AuthUserTokens.sig (si includeToken est vrai).
AuthAction Un objet qui définit les options de rendu / redirection pour withUser et withUserTokenSSR . Voir Authaction.
Voir un exemple de configuration ici. Fournissez la configuration lorsque vous appelez init .
String|Function|Object - Une pageurl
L'URL par défaut pour accéder au moment où withUser ou withUserTokenSSR doit rediriger vers la connexion. Facultatif à moins d'utiliser l'action AuthAction.REDIRECT_TO_LOGIN Auth.
String|Function|Object - Une pageurl
L'URL par défaut pour accéder au moment withUser ou withUserTokenSSR doit rediriger vers l'application. Facultatif à moins d'utiliser l'action AuthAction.REDIRECT_TO_APP Auth.
String
Le point de terminaison de l'API Ce module appellera lorsque l'état AUTH modifie un utilisateur de base Firebase authentifié.
String
Le point de terminaison de l'API Ce module appellera lorsque l'état AUTH modifie un utilisateur de base de feu Fire-Authenticated.
Function (facultatif)
Un gestionnaire appelé si le point de terminaison de l'API de connexion renvoie une réponse non 200. Si un gestionnaire n'est pas défini, cette bibliothèque enfile les réponses non non 200.
Non utilisé ou autorisé si un tokenChangedHandler personnalisé est défini.
Function (facultatif)
Un gestionnaire appelé si le point de terminaison de l'API de déconnexion renvoie une réponse non 200. Si un gestionnaire n'est pas défini, cette bibliothèque enfile les réponses non non 200.
Non utilisé ou autorisé si un tokenChangedHandler personnalisé est défini.
Function
Un rappel qui s'exécute lorsque l'état de l'authentique change pour un utilisateur particulier. Utilisez-le si vous souhaitez personnaliser la façon dont votre application côté client appelle vos points de terminaison API de connexion / déconnexion (par exemple, pour utiliser un chercheur personnalisé ou ajouter des en-têtes personnalisés). tokenChangedHandler reçoit un User comme argument et est appelé lorsque le jeton ID de l'utilisateur change, de la même manière que l'événement onIdTokenChanged de Firebase.
Si ce rappel est spécifié, l'utilisateur est responsable de:
Voir le gestionnaire par défaut pour obtenir des conseils.
String
L'hôte et le port de l'émulateur d'autant Firebase local. Si cette valeur est définie, l'émulateur d'auteur sera initialisé avec l'hôte fourni et le port.
Doit correspondre à la valeur de la variable d'environnement FIREBASE_AUTH_EMULATOR_HOST , par exemple, localhost:9099 .
Object
Configuration transmise à firebase-admin initializeApp . Il doit contenir une propriété credential (un objet simple) et une propriété databaseURL . Obligatoire à moins que vous initialisez vous-même firebase-admin avant d'initialiser next-firebase-auth .
Le firebaseAdminInitConfig.credential.privateKey ne peut pas être défini du côté client et devrait vivre dans une variable d'environnement secrète.
Utilisation de Vercel? Voir l'ajout d'une clé privée à Vercel pour obtenir des conseils.
Boolean
Lorsqu'il est vrai, firebase-admin trouvera implicitement votre compte de service d'environnement d'hébergement pendant initializeApp . Ceci est applicable à la fois pour Firebase et Google Cloud Platform, et recommandé sur l'ajout de clé de compte de service au code via le chemin du fichier ou la valeur directe.
Remarque : Pour configurer firebase-admin , firebaseAdminInitConfig ou useFirebaseAdminDefaultCredential doivent être fournis. L'utilisation des informations d'identification par défaut remplacera les valeurs transmises à firebaseAdminInitConfig.credential si les deux sont présentés.
Object
Configuration correspondant à Firebase JS SDK initializeApp . La valeur firebaseClientInitConfig.apiKey est toujours requise . Nous vous recommandons d'initialiser vous-même le SDK du client Firebase avant d'initialiser next-firebase-auth ; Cependant, next-firebase-auth tentera d'initialiser Firebase si une application Firebase n'existe pas déjà.
Object
Paramètres utilisés pour les cookies Auth. Nous utilisons cookies pour gérer les cookies.
Les propriétés comprennent:
name : Utilisé comme base pour les noms de cookies: Si name est défini sur "MyExample", les cookies seront nommés MyExample.AuthUser et MyExample.AuthUserTokens (plus MyExample.AuthUser.sig et MyExample.AuthUserTokens.sig si les cookies sont signés). Requis.keys : une gamme de chaînes qui seront utilisées pour signer des cookies; Par exemple, ['xD$WVv3qrP3ywY', '2x6#msoUeNhVHr'] . Comme ces chaînes sont des secrets, fournissez-les via des variables d'environnement secret, telles que [ process.env.COOKIE_SECRET_CURRENT, process.env.COOKIE_SECRET_PREVIOUS ] . Le tableau keys est transmis au constructeur KeyGrip comme décrit dans le package cookies . Requis sauf si signed est définie sur false .cookies.set . La valeur keys ne peut pas être définie du côté client et doit vivre dans une variable d'environnement secrète.
Pour la sécurité, la valeur maxAge doit être de deux semaines ou moins. Notez que maxAge est défini en millisecondes.
Remarque: Les expirations des cookies seront étendues automatiquement lorsque l'utilisateur charge le SDK JS Firebase.
Le SDK Firebase JS est la source de la vérité pour l'authentification, donc si les cookies expirent mais que l'utilisateur est toujours authentique avec Firebase, les cookies seront automatiquement réglés lorsque l'utilisateur charge le SDK JS Firebase JS - mais l'utilisateur ne sera pas autoritaire pendant SSR lors de cette première demande.
Function (facultatif)
Handler d'erreur qui sera appelé en cas d'erreur inattendue lors de la vérification du côté serveur de jeton ID de l'utilisateur. Il recevra une erreur d'authentification Firebase.
Cette bibliothèque ne lancera pas lorsqu'elle ne peut pas vérifier un jeton ID. Au lieu de cela, il fournira un utilisateur non authentifié à l'application. Il gérera généralement les erreurs courantes liées à l'AUTH telles que auth/id-token-expired et auth/user-disabled sans lancer. Voir # 366 et # 174 pour un arrière-plan supplémentaire.
Function (facultatif)
Handler d'erreur qui sera appelé en cas d'erreur inattendue tout en rafraîchissant le côté serveur de jeton ID de l'utilisateur.
Cette bibliothèque ne lancera pas lorsqu'elle ne peut pas rafraîchir un jeton ID. Au lieu de cela, il fournira un utilisateur non authentifié à l'application. Voir # 366 et # 174 pour un arrière-plan supplémentaire.
Définit les actions à prendre en fonction de l'état de l'authentification d'un utilisateur, en utilisant les constantes suivantes:
AuthAction.RENDER : Rendez le composant enfant
AuthAction.SHOW_LOADER : afficher un composant de chargeur
AuthAction.RETURN_NULL : retournez null au lieu de tout composant
AuthAction.REDIRECT_TO_LOGIN : rediriger vers la page de connexion
AuthAction.REDIRECT_TO_APP : rediriger vers l'application
L'objet utilisateur est utilisé dans les contextes côté serveur et côté client. Il s'agit d'une représentation normalisée d'un utilisateur de base de base.
id - String|null
L'ID de l'utilisateur Firebase, ou null si l'utilisateur n'est pas authentifié.
Email - String|null
L'adresse e-mail de l'utilisateur de Firebase, ou null si l'utilisateur n'a pas d'adresse e-mail.
EmailVerified - Boolean
Si l'adresse e-mail de l'utilisateur est vérifiée.
phonenumber - String|null
Ajouté dans V0.13.1
Le numéro de téléphone de l'utilisateur Firebase, ou null si l'utilisateur n'a pas de numéro de téléphone.
DisplayName - String|null
Ajouté dans V0.13.1
Le nom d'affichage de l'utilisateur de Firebase, ou null si l'utilisateur n'a pas de nom d'affichage.
Photourl - String|null
Ajouté dans V0.13.1
L'URL photo de l'utilisateur de Firebase, ou null si l'utilisateur n'a pas d'URL photo.
réclamation - Object
Ajouté dans V0.13.0
Toute base de base personnalisée.
getIdToken - Function => Promise<String|null>
Une fonction asynchrone qui se résout en une chaîne de jeton ID Firebase valide, ou null si aucun jeton valide n'est disponible.
ClientInitialialized - Boolean
Si le SDK Firebase JS a initialisé. Si true , nous n'utilisons plus d'informations utilisateur à partir d'accessoires côté serveur.
Firebaseuser - FirebaseUser |null
L'utilisateur du SDK Firebase JS, s'il a été initialisé. Sinon, null.
Signout - Function => Promise<void>
Une méthode qui appelle signOut de Firebase si le SDK JS Firebase a été initialisé. Si le SDK n'a pas été initialisé, cette méthode est un non-op.
String|Function|Object
Utilisé dans appPageURL et authPageURL dans les composants de configuration et d'ordre supérieur, le PageUrl définit une URL de destination de redirection ou un chemin.
Il peut s'agir d'une chaîne: /my-url/here/
Ou un objet:
{
destination : '/my-url/here/' , // Required string: the URL destination of a redirect
basePath : false , // whether to use the Next.js base path.
} Ou une fonction qui reçoit { ctx, user } et renvoie une chaîne ou un redirectobject:
const redirect = ( { ctx , user } ) => {
// any custom logic here
return `/my-url/here/?username= ${ user . displayName } `
} Le ctx est la valeur de contexte suivante.
Voir Exemples.md.
Bloqué? Recherchez des discussions ou ouvrez votre propre discussion de questions-réponses décrivant ce que vous avez déjà essayé.
Voici quelques étapes initiales que vous pouvez prendre pour déboguer les problèmes:
onVerifyTokenError et onTokenRefreshError dans votre configuration et vérifiez tous les journaux d'erreur.debug: true dans votre configuration et lisez les journaux de débogage côté serveur et côté client pour tout message utile.Nous nous attendons à ce que certaines valeurs de configuration sensibles soient falsives du côté client (voir le code de validation de configuration). C'est une précaution pour s'assurer que les développeurs ne regroupent pas accidentellement quelque chose comme leur clé privée Firebase avec le client JS.
Pour résoudre ce problème, assurez-vous que le paramètre de configuration undefined du côté client en le enregistrant à votre console de navigateur. Vous pouvez utiliser la prise en charge .env de NEXT pour définir des variables de serveur uniquement. N'utilisez jamais le préfixe NEXT_PUBLIC* pour des valeurs secrètes.
Ce package appellera un point de terminaison Google lorsqu'il doit actualiser un côté serveur de jeton. Vous voyez une erreur de cette demande.
Pour résoudre ce problème, confirmez que votre firebaseAdminInitConfig.credential.clientEmail est correct. Ce devrait être l'e-mail associé à votre clé privée Firebase.
Si cela n'aide pas, essayez d'inspecter le jeton personnalisé pour valider manuellement les valeurs et la structure. Certaines personnes rencontrent ce problème lorsque le temps de leur serveur est incorrect.
withUserTokenSSR , mais l'authentification côté client fonctionne.Si Auth travaille du côté client mais pas du côté du serveur, les cookies AUTH ne sont probablement pas définis.
Pour résoudre ce problème, confirmez que les cookies Auth sont définis dans les outils de développement de votre navigateur. S'ils ne sont pas définis, veuillez vérifier que les options secure , sameSite et path ont été transmises dans la configuration next-firebase-auth ont un sens pour votre environnement. Par exemple, si vous testez non-HTTPS localhost, assurez-vous que secure est faux.
De plus, veuillez vérifier les journaux de vos serveurs pour toute erreur pour vous assurer que l'application Admin Firebase initialise correctement.
Souvent, cela est causé par un e-mail incorrect dans les informations d'identification de Firebase. Veuillez vérifier que l'e-mail est correct et provient du même compte Firebase que votre clé privée, ou essayez de générer une nouvelle clé: https://firebase.google.com/docs/admin/setup
Vous pouvez essayer de configurer vos informations d'identification dans l'exemple d'application pour vous assurer que votre code d'application n'est pas un problème.
Dans le développement local, essayez de nettoyer les données / cookies pour localhost au cas où vous vous connecriez auparavant avec un autre compte Firebase et que vous ayez toujours signé des cookies par une autre clé privée.
Vous pouvez également essayer de désactiver l'émulateur d'authentification Firebase. Supprimez firebaseAuthEmulatorHost de votre configuration et supprimez FIREBASE_AUTH_EMULATOR_HOST de votre fichier .env .
Voir l'ajout d'une clé privée à Vercel et cette discussion sur le formatage des clés privées.
Nous nous attendons à ce que certaines applications auront besoin de certaines fonctionnalités qui ne sont pas actuellement disponibles:
Nous aimerions entendre vos commentaires sur ces fonctionnalités ou d'autres. N'hésitez pas à ouvrir une discussion!
Nous accueillons les contributions! Veuillez consulter les documents contributifs pour commencer.