Firebase: проверка существующего displayName перед разрешением пользователю зарегистрироваться - PullRequest
0 голосов
/ 30 марта 2020

Прежде чем разрешить пользователю зарегистрироваться, я хочу сделать проверку базы данных, чтобы увидеть, существует ли имя пользователя уже. Попробовал следующие записи 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"
        }
      }
    }
  }
}

Репо для справки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...