问题描述
在我的应用程序中,我想在使用电子邮件创建用户后注销用户,以便验证他的电子邮件。我尝试了不同的方法,但它们不起作用。这是我的代码:
try {
await app
.auth()
.createuserWithEmailAndPassword(email.value,password.value)
.then((userCredential)=>{
// send verification mail.
userCredential.user.sendEmailVerification();
alert("Email sent");
})
.catch(alert);
//history.push("/");
} catch (error) {
alert(error);
}
我从另一个组件导入了 firebase 初始化器:
import firebase from "firebase/app";
import "firebase/auth";
const app = firebase.initializeApp({
apiKey: process.env.REACT_APP_FIREBASE_KEY,authDomain: process.env.REACT_APP_FIREBASE_DOMAIN,databaseURL: process.env.REACT_APP_FIREBASE_DATABASE,projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID,storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET,messagingSenderId: process.env.REACT_APP_FIREBASE_SENDER_ID,appId: process.env.REACT_APP_FIREBASE_APP_ID,});
export default app;
这是我的身份验证上下文:
useEffect(() => {
app.auth().onAuthStateChanged((user) => {
setCurrentUser(user);
setPending(false);
});
},[]);
if (pending) {
return <>Loading...</>;
}
return (
<AuthContext.Provider
value={{
currentUser,}}
>
{children}
</AuthContext.Provider>
);
};
对此有什么想法吗?
解决方法
您可以尝试使用 signOut
方法注销用户:
// unsubscribe Auth listener here
return app.auth()
.createUserWithEmailAndPassword(email.value,password.value)
.then(async (userCredential)=>{
// send verification mail.
await userCredential.user.sendEmailVerification();
await app.auth().signOut();
alert("Email sent");
})
尽管如果用户的电子邮件未通过验证,您不需要将其注销(取决于您希望您的应用如何工作,但只是一个注释)。 您可以简单地检查电子邮件是否经过验证,如果没有,则提示用户进行验证,否则不允许他们使用该应用。
User 对象有一个属性 emailVerified 可以这样做:
if (!app.auth().currentUser.emailVerified) {
alert("Please verify the email")
}
您还可以检查电子邮件是否在安全规则中得到验证:
match /{document=**} {
allow read,write: if request.auth != null && request.auth.token.email_verified;
}