【问题标题】:React: Verifying Email from Firebase throws auth/operation-not-allowed Firebase: Error (auth/operation-not-allowed)React:验证来自 Firebase 的电子邮件会引发 auth/operation-not-allowed Firebase:错误(auth/operation-not-allowed)
【发布时间】:2022-01-15 05:28:35
【问题描述】:

我正在尝试通过使用sendEmailVerification 发送电子邮件链接来执行电子邮件验证。我在我的电子邮件中收到了如下所示的电子邮件:

http://localhost:3000/signup-success?mode=verifyEmail&oobCode=oKyOD4XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAF-XCNUIg&apiKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&lang=en

我怀疑要验证电子邮件,我们需要有一个不同于signInWithEmailLink 的函数?

它重定向到我的注册成功页面,如下所示:

import React, { ReactElement } from 'react';
import auth from '../firebase/firebase_client';
import {
  User,
  isSignInWithEmailLink,
  signInWithEmailLink,
} from 'firebase/auth';
import { frontendRoutes } from '../components/constants/frontend-routes';
import Link from 'next/link';
import { useAppDispatch } from '../redux/app/hooks';
import { updateNotification } from '../redux/slices/notifications';
import { useRouter } from 'next/router';

export default function SignupSuccess(): ReactElement {
  const [user, setUser] = React.useState<User | null>(null);
  const dispatch = useAppDispatch();
  const [emailVerified, setEmailVerified] = React.useState(false);
  const router = useRouter();

  React.useEffect(() => {
    auth.onAuthStateChanged((user) => {
      let email;
      if (user !== null) {
        setUser(user);
        email = user.email;
        console.log('Email = ', email, user.emailVerified);
        if (isSignInWithEmailLink(auth, window.location.href)) {
        }
      } else {
        email = window.prompt('Please provide your email for confirmation');
      }
      if (email) {
        signInWithEmailLink(auth, email, window.location.href)
          .then((result) => {
            const user = result.user.displayName;
            dispatch(
              updateNotification({
                message: `Congrats ${
                  user || 'User'
                }. Your Email has been verified.`,
                status: 'success',
                title: 'Verification Success',
              })
            );
            console.log('Success');
            setEmailVerified(true);
          })
          .catch((error) => {
            console.log(
              'Error occured while verifying: ' + error.code,
              error.message
            );
            console.log('Error = ', error);
            dispatch(
              updateNotification({
                message: `Verification Failed. Common errors could be invalid email and invalid or expired OTPs.`,
                status: 'error',
                title: 'Verification Failed',
              })
            );
          });
      } else {
        dispatch(
          updateNotification({
            message: 'Verification Failed as no email was provided',
            status: 'error',
            title: 'Verification Failed',
          })
        );
        setTimeout(() => router.push('/'), 3000);
      }
    });
  }, [dispatch, router]);

  if (user) {
    return (
      <div>
        <h1>Welcome {user.email}</h1>
        {emailVerified ? (
          <p>
            Congrats, your email has been verified! Please wait for admin
            approval before you could start using Break Free Services. Go Back
            to{' '}
            <Link href={frontendRoutes.LOGIN_FOR_MERCHANT_INDIVIDUAL}>
              Login Page
            </Link>{' '}
          </p>
        ) : (
          <p>Verifying...</p>
        )}
      </div>
    );
  }
  return <div>Continue to Sign Up First.</div>;
}

我在 Firebase 中启用的提供程序是:- Email ProviderPhone Number。但我仍然收到此错误,谁能告诉我出了什么问题?

编辑 1: 我刚刚意识到我所做的方法调用只是用电子邮件登录而不是验证一个。似乎您无法将用户重定向到您的网站,然后从那里处理响应,除非您自己有自定义域。如果有人知道将用户重定向到本地主机或您的网站并从那里进行验证,请添加它,否则我会关闭问题。

【问题讨论】:

    标签: firebase firebase-authentication


    【解决方案1】:

    不,您不需要signInWithEmailLink 函数。 auth.onAuthStateChanges 是在 firebase 中使用方法的旧版本。尝试使用onAuthSateChanges(auth, user =&gt; {...}) 这个函数是一个观察者,它正在观察用户正在发生的事情。要使用电子邮件和密码注册,您需要signInWithEmailAndPassword(auth, email, password) 功能。

    发送电子邮件验证:

    火力基地 9+

    import { getAuth, sendEmailVerification } from "firebase/auth";
    
    const auth = getAuth();
    sendEmailVerification(auth.currentUser)
    

    火力基地 X

    firebase.auth().currentUser.sendEmailVerification()
    

    sugnInWithEmailLink() 函数是某种登录函数,例如signInWithEmailAndPasswird()

    【讨论】:

    • 嘿!感谢您的回答,我非常了解,我很想知道是否有可以用来执行verifyEmailfromVerificationLink 的firebase 函数或api。我能够发送验证并且效果很好,问题是单击后我希望用户重定向到我的页面或更改显示的 Firebase 验证模板
    • 如果您通过验证向用户发送电子邮件,则其余 api 将为您验证电子邮件。与发送电子邮件更改密码相同。
    • 您在 firebase 项目中有模板。
    • 是的,所以当 firebase 发送触发该 api 的链接时,它会到达原生 firebase 页面。我要么希望登陆在我的自定义页面上,要么能够自定义该 Firebase 登陆页面。另外我没有使用 firebase 项目,我只是使用它的 auth 库来执行所有这些身份验证
    • 你需要自己阅读,我没有时间抱歉。但这是可能的。
    猜你喜欢
    • 2021-12-04
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多