仅当用户存在时才向Google Auth Provider进行身份验证

时间:2018-09-25 22:06:50

标签: javascript reactjs firebase firebase-authentication google-cloud-firestore

我正在使用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 :(得分:2)

具有Firebase安全规则,只能检查密钥是否存在-因此,不能在users表中进行搜索:

"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注册-但是,尽管他们无法登录,但需要付出同样的努力(除了必须不时清理用户数据库);例如。带有云功能,该功能可删除在emails“表”中没有其电子邮件作为关键字的用户。

Firestore安全规则中,可以使用以下命令进行检查:

  • request.auth.token.emailrequest.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)
    }
}

答案 1 :(得分:2)

如果您确实要使用signInWithPopup方法,则可以使用此选项, 但这不是最好的方法。当您使用Google登录时,signInWithPopup方法将返回一个Promise。您可以从结果对象访问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方法。根据{{​​3}},

  

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);
               }
          });
}

docs是Firebase github存储库中的示例。

答案 2 :(得分:0)

您登录后从firebase收到的对象具有isNewUser,其中您具有属性CompiledRazorAssemblyPart

您可以在此处找到参考:https://firebase.google.com/docs/reference/js/firebase.auth.html#.AdditionalUserInfo