Только аутентифицируйтесь с провайдером аутентификации Google, если пользователь существует - PullRequest
0 голосов
/ 26 сентября 2018

Я использую Firebase для аутентификации пользователей в нашем приложении, используя GoogleAuthProvider.Но я не хочу, чтобы новый пользователь входил в систему, если он еще не прошел проверку подлинности.

Если пользователь существует , войдите в него и console.log('user ' + user.email + ' does exist!');.

Однако, если пользователь не существует .Тогда не разрешайте аутентификацию и console.log('user ' + user.email + ' does not exist!')

var googleProvider = new firebase.auth.GoogleAuthProvider();
export const doSignInWithGoogle = () => auth.signInWithPopup(googleProvider);

googleLogin = () => {
    auth
      .doSignInWithGoogle()
      .then(result => {
        var user = result.user;
        const userRef = db.collection('users').doc(user.uid);
        userRef.get().then(docSnapshot => {
          if (docSnapshot.exists) {
            userRef.onSnapshot(() => {
              console.log('user ' + user.email + ' does exist!');
            });
          } else {
            console.log('user ' + user.email + ' does not exist!');
          }
        });
      })
      .catch(error => {
        this.setState(updateByPropertyName('error', error));
      });
  };

Я думал, что ссылки на пользовательские записи в Firestore будут простым подходом к этому.Однако, возможно, у Firebase Auth уже есть способ сделать это.Я не могу найти документацию или какой-либо пример.

В приведенном выше коде ничего не регистрируется, и пользователь либо создается, либо входит в систему.

Как я могу запретить новым пользователям регистрироваться, в то же время позволяя текущим пользователям подписыватьв?

Ответы [ 3 ]

0 голосов
/ 30 сентября 2018

Если вы действительно хотите использовать метод signInWithPopup, у вас есть эта опция, но это не лучший способ.когда вы входите в Google, метод signInWithPopup возвращает обещание.вы можете получить доступ к свойству isNewUser в additionalUserInfo из результирующего объекта.затем удалите только что созданного пользователя.

firebase.auth().signInWithPopup(provider).then(
     function (result) {
          var token = result.credential.accessToken;
          var user = result.user;

          //this is what you need
          var isNewUser = result.additionalUserInfo.isNewUser;
          if (isNewUser) {
               //delete the created user
               result.user.delete();
          } else {
               // your sign in flow
               console.log('user ' + user.email + ' does exist!');
          }
     }).catch(function (error) {
     // Handle Errors here.

});

Это простой способ, но удаление после создания не является наилучшей практикой.Существует еще одна опция,

, которую вы можете использовать, signInAndRetrieveDataWithCredential метод для этого.в соответствии с документами ,

auth/user-not-found будет выброшено при входе с учетными данными из firebase.auth.EmailAuthProvider#credential, и нет пользователя, соответствующего данному адресу электронной почты.

function googleSignInWithCredentials(id_token) {
     // Build Firebase credential with the Google ID token.
     var credential = firebase.auth.GoogleAuthProvider.credential(id_token);

     // Sign in with credential from the Google user.

     firebase.auth().signInAndRetrieveDataWithCredential(credential)
          .then(function (userCredential) {
               //sign in
               console.log(userCredential.additionalUserInfo.username);
          }).catch(function (error) {
               // Handle Errors here.
               var errorCode = error.code;
               if (errorCode === 'auth/user-not-found') {
                    //handle this
               } else {
                    console.error(error);
               }
          });
}

здесь - пример из репозитория GitHub на базе Firebase.

0 голосов
/ 01 октября 2018

Объект, который вы получаете от firebase после входа в систему, имеет additionalUserInfo, где у вас есть свойство isNewUser.

Ссылку вы можете найти здесь: https://firebase.google.com/docs/reference/js/firebase.auth.html#.AdditionalUserInfo

0 голосов
/ 28 сентября 2018

с Firebase правилами безопасности, можно только проверить, существуют ли ключи - поэтому поиск в таблице пользователей не вариант:

"emails": {
    "example1@gmail.com": true,
    "example2@gmail.com": true
}

, а затем можно проверить с правилами безопасности, если auth.token.email существует в качестве ключа :

{
    "rules": {
        ".read": "root.child('emails').child(auth.token.email).exists(),
        ".write": false,
    }
}

в клиенте, это должно выдать ошибку "The read failed: Permission denied error", которая будет обработана соответствующим образом.подключиться к регистрации в Firebase невозможно - но, хотя они не могут войти, это требует тех же усилий (за исключением того, что on время от времени приходится очищать базу данных пользователей);например.с помощью облачной функции, которая удаляет пользователей, чьи электронные адреса не указаны в качестве ключа в «таблице» emails.

в Firestore правилах безопасности, можно проверить с помощью:

  • request.auth.token.email & request.auth.token.email_verified

, например, с коллекцией под названием emails и коллекцией с именем content:

match /databases/{database}/documents {

    function userMatchesId(userId) {
        return request.auth != null && request.auth.uid == userId
    }
    function readAllowed(email) {
        return if get(/databases/$(database)/documents/emails/$(request.auth.token.email)).data != null
    }

    match /users/{userId} {
        allow get: if userMatchesId(userId)
    }
    match /content {
        allow get: if readAllowed(request.auth.token.email)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...