ReactJs 和 Firebase UI 身份验证问题

问题描述 投票:0回答:2

首先我想说的是,我主要开发 Web 应用程序和管理软件的后端,但我也使用过相当多的 JavaScript(通常使用 jQuery,我现在意识到这是一种有点过时的方法)。我开始探索一些用于教育和商业目的的新技术,我认为将 Reactjs 前端与 Firebase 中存储的数据结合起来,利用它提供的所有支持工具,尤其是身份验证,是个好主意。

我已经设置了一个非常简单的基本应用程序,如果您没有登录,它会将您带到登录屏幕,如果您已登录,它会向您显示您的电子邮件和 ID,所有这些都非常基本。对于登录,我想使用 Firebase UI,这是 Google 提供的界面,允许您使用电子邮件和密码登录,以及使用 Google 和许多其他提供商登录。然而,我只需要电子邮件/密码和谷歌。

因此,在完成此操作的人的在线教程的帮助下,我将所有内容放在一起,并且它似乎运行没有错误。然而,我面临两个实际问题:

当我使用电子邮件/密码登录时,我输入我的电子邮件,它提示我通过输入密码创建一个帐户,我这样做并登录。我还会收到一封验证电子邮件,这有效。问题是,如果我注销然后尝试使用相同的凭据重新登录,它实际上会提示我通过输入新密码来创建新用户。如果我尝试继续,它会说电子邮件已存在,我可以重置密码。

使用 Google 帐户选项时,弹出模式工作正常。但是,重定向模式会将我带到 Google 登录,请求权限,返回应用程序,但本质上不会触发用户登录的任何回调(与弹出版本中发生的情况不同)。有趣的是,用户仍然是在 Firebase 中创建的,但我无法登录到 React 应用程序。

我附上了三个主要组件(不期望任何人一定会经历它们)。请您理解;这是我对 React 的第一次测试:

应用程序组件:App.js

import React, { useEffect, useState } from 'react';
import logo from './logo.svg';
import './App.css';
import Login from './Login';
import {Authenticated} from './Authenticated';
import {  firebaseConfig } from './firebase_config.js'; // i don't attach the file, there are only API keys of firebase account
import {initializeApp } from 'firebase/app';

import * as firebaseui from "firebaseui/dist/npm__it"; // it's like the original one but only done with italian strings

import { getAuth, setPersistence, browserLocalPersistence, onAuthStateChanged  } from "firebase/auth";
import {getFirestore} from 'firebase/firestore'; 
import {BrowserRouter, Route, Routes, } from 'react-router-dom'
const appFirebase=initializeApp(firebaseConfig);
const auth=getAuth(appFirebase);
const ui=new firebaseui.auth.AuthUI(auth);
function App() {
  
  const [user, setUser]= useState();
  useEffect(()=> {
    
    onAuthStateChanged(auth, (userFound)  =>{
      console.log("Auth changed",auth);
      if (userFound) {
        setUser({email: userFound.email, id: userFound.uid});

      }
      else setUser(null);
      
    });
  });
  
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        
        <BrowserRouter>
        <Routes>
            <Route path="/login" element={<Login auth={auth} user={user} ui={ui}/>}></Route>          
            <Route path="/" element={<Authenticated user={user} />}> </Route>
        </Routes>
        </BrowserRouter>
        {user && <div><button onClick={() => { auth.signOut()}} >Logout</button></div>}
      </header>
    </div>
  );
}

export default App;
export { auth };

登录组件:Login.js

import React, { useEffect, useState } from 'react';
import { EmailAuthProvider, GoogleAuthProvider, sendEmailVerification    } from "firebase/auth";
import 'firebaseui/dist/firebaseui.css'
import {Navigate} from 'react-router-dom';


const  Login = (props) => {
  

  useEffect(() => {
          
      props.ui.start('#firebaseui-auth-container', {
      callbacks: {
        
          signInFailure: function (error) {
            console.log(error);
          },
          signInSuccessWithAuthResult: function(authResult, redirectUrl) {    
            console.log("signed id",authResult);
            props.auth.languageCode = 'it';

            if (authResult.additionalUserInfo.isNewUser && authResult.additionalUserInfo.providerId==="password")
            {
                console.log("new signin");
                sendEmailVerification(authResult.user);
            }
            return true;
          },
        
      },
      signInSuccessUrl: '/login',
      
      signInOptions: [
        {
          provider: EmailAuthProvider.PROVIDER_ID,
          requireDisplayName: false
        },    
        GoogleAuthProvider.PROVIDER_ID,
      ],
      tosUrl: '<your-tos-url>',
  
      privacyPolicyUrl: '<your-privacy-policy-url>'
    });
  }, [props.auth,props.ui]);
  
  return (
    <>{props.user && (
      <Navigate to="/" replace={true} />
    )}<div>
      <h1>Accesso / Registrazione</h1>
      <div id="firebaseui-auth-container"></div>
    </div></>
  );
}

export default Login;

经过身份验证的组件:Authenticated.js

import React from "react";

import { Navigate} from 'react-router-dom'

export const Authenticated = (props) => {
    const user=props.user;
    return <>{!user ? 
        <Navigate to="/login" replace={true} />
      :<div>Authenticated
        <div><span>Email</span>:<span>{user.email}</span></div>
        <div><span>Uid</span>:<span>{user.id}</span></div>

    </div>}</>
}

我正在使用以下版本:

-firebase 10.4.0 -firebaseui 6.1.0

这些基本上是 Google 建议从此处安装的版本: https://firebase.google.com/docs/auth/web/firebaseui?hl=it

谢谢大家。

我尝试到处搜索相同的问题,但没有发现任何地方。 我期待一些 firebase/reactjs GURU 的建议:)

reactjs firebase firebaseui
2个回答
3
投票

此问题与 Firebase 身份验证的更改有关(添加了电子邮件枚举保护作为 2023 年 9 月 15 日之后创建的所有新项目的默认设置)。 Firebase UI 尝试获取电子邮件地址的所有可用登录方法,但由于更改,仅返回空数组。

有两种选择可以解决该问题:


0
投票

我可以建议的解决方案是 首先,您需要使用正确的配置初始化火力基地 使用useEffect触发firebase 确保允许您调用 firebase Api 的权限 确保您有兼容的版本 firebase 确保身份验证状态在会话中持续存在

然后你可以再试一次

这个问题来自全栈开发

为了让事情更清楚你可以参考在线课程, 您可以查看Tutorlix.com

© www.soinside.com 2019 - 2024. All rights reserved.