Je travaille sur une application next.js qui utilise Firebase. Je dois utiliser le package d'authentification Firebase pour restreindre l'accès aux pages. L'exemple with-firebase-authentication ne montre pas l'authentification pour plusieurs pages.
import React from 'react'; import Router from 'next/router'; import { firebase } from '../../firebase'; import * as routes from '../../constants/routes'; const withAuthorization = (needsAuthorization) => (Component) => { class WithAuthorization extends React.Component { componentDidMount() { firebase.auth.onAuthStateChanged(authUser => { if (!authUser && needsAuthorization) { Router.push(routes.SIGN_IN) } }); } render() { return ( <Component { ...this.props } /> ); } } return WithAuthorization; } export default withAuthorization;
3 Réponses :
Bonjour après quelques recherches ici , il semble y avoir deux façons de faire ce. Soit vous alternez le processus d'initialisation de la page en utilisant Custom pour y inclure l'authentification - auquel cas vous pouvez transférer l'état d'authentification comme accessoire à la page suivante - ou vous demander un nouvel état d'authentification pour chaque chargement de page.
Ceci est un exemple de React Firebase Authentication , mais il devrait également fonctionner avec next.js
.
L'idée principale est de créer un composant d'ordre supérieur, qui vérifie si l'utilisateur est authentifié et encapsule toutes les pages autour de cela:
const withAuthorization = (needsAuthorization) => (Component) => { class WithAuthorization extends React.Component { state = { authenticated: null } componentDidMount() { firebase.auth.onAuthStateChanged(authUser => { if (!authUser && needsAuthorization) { Router.push(routes.SIGN_IN) } else { // authenticated this.setState({ authenticated: true }) } }); } render() { if (!this.state.authenticated) { return 'Loading...' } return ( <Component { ...this.props } /> ); } } return WithAuthorization; }
Vous pouvez remplacer _app.js
et ne renvoyer
que si l'utilisateur est authentifié.
Vous pouvez faire quelque chose comme ceci:
import React from 'react'; const withAuthentication = Component => { class WithAuthentication extends React.Component { render() { return <Component {...this.props} />; } } return WithAuthentication; }; export default withAuthentication;
Le mieux serait de gérer cela sur le serveur.
J'ai modifié la question en une solution que j'ai trouvée mais la page ne redirige qu'une fois le contenu de la page rendu.
dois-je ajouter le HOC au composant de page ???? J'ai essayé quelque chose comme vous l'avez fait ci-dessus, mais il rend puis redirige ..
J'ai également eu du mal à intégrer l'authentification Firebase, mais a fini par utiliser l'approche détaillée dans l'exemple with-iron-session sur nextjs: https://github.com/hajola/with-firebase-auth-iron-session