Прежде чем разрешить пользователю зарегистрироваться, я хочу сделать проверку базы данных, чтобы увидеть, существует ли имя пользователя уже. Попробовал следующие записи this и this StackOverflow.
Я ожидал, что пользователь не сможет войти в систему, однако ему все равно разрешено войти :(
Register.js
import React, { useContext, useEffect, useState } from 'react';
import { useNavigate } from 'react-router-dom';
import firebase from '../firebase';
import { UserContext } from '../userContext';
export const Register = () => {
const navigate = useNavigate();
const [emailAddress, setEmailAddress] = useState('');
const [username, setUsername] = useState('');
const [password, setPassword] = useState('');
const currentUser = useContext(UserContext);
const handleSubmit = async event => {
event.preventDefault();
try {
await firebase
.auth()
.createUserWithEmailAndPassword(emailAddress, password);
navigate('/');
} catch {}
};
useEffect(() => {
(async () => {
if (currentUser) {
await currentUser?.updateProfile({
displayName: username,
});
const usernamesRef = firebase.database().ref('usernames');
const newUsername = {
[username]: currentUser.uid,
};
usernamesRef.push(newUsername);
const usersRef = firebase.database().ref('users');
const newUser = {
[currentUser.uid]: {
email: emailAddress,
username,
},
};
usersRef.push(newUser);
}
})();
}, [currentUser, emailAddress, username]);
useEffect(() => {
if (currentUser) {
navigate('/');
}
}, [currentUser, navigate]);
return (
<div>
<form onSubmit={handleSubmit}>
<label htmlFor="email-address">Email Address: </label>
<input
id="email-address"
onChange={event => setEmailAddress(event.target.value)}
value={emailAddress}
/>
<label htmlFor="username">Username: </label>
<input
id="username"
onChange={event => setUsername(event.target.value)}
value={username}
/>
<label htmlFor="password">Password: </label>
<input
id="password"
onChange={event => setPassword(event.target.value)}
type="password"
value={password}
/>
<button type="submit">Register</button>
</form>
</div>
);
};
Правила базы данных Firebase в реальном времени на основе этого ответа StackOverflow :
{
"rules": {
".read": "auth != null",
".write": "auth != null",
"users": {
"$uid": {
".write": "auth !== null && auth.uid === $uid",
".read": "auth !== null && auth.provider === 'password'",
"username": {
".validate": "!root.child('usernames').child(newData.val()).exists() || root.child('usernames').child(newData.val()).val() == $uid"
}
}
}
}
}
Репо для справки