代码之家  ›  专栏  ›  技术社区  ›  Shivam Sahil

React:验证来自Firebase的电子邮件时抛出不允许的auth/operation Firebase:错误(不允许的auth/operation)

  •  0
  • Shivam Sahil  · 技术社区  · 4 年前

    我正在尝试通过使用发送电子邮件链接来执行电子邮件验证 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 Provider Phone Number 。但我还是犯了这个错误,有人能告诉我出了什么问题吗?

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

    1 回复  |  直到 4 年前
        1
  •  0
  •   Mises Konrad    4 年前

    不,你不需要 signInWithEmailLink 作用 auth.onAuthStateChanges 是firebase中使用方法的旧版本。尝试使用 onAuthSateChanges(auth, user => {...}) 这个功能是一个观察者,观察用户的行为。要使用电子邮件和密码注册,您需要 signInWithEmailAndPassword(auth, email, password) 功能。

    发送电子邮件验证:

    火球9+

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

    火球X<9

    firebase.auth().currentUser.sendEmailVerification()
    

    sugnInWithEmailLink() 函数是某种登录函数,类似于 signInWithEmailAndPasswird()