如果用户存在,则仅使用 Google 身份验证提供程序进行身份验证

Dar*_*ren 8 javascript firebase reactjs 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));
      });
  };
Run Code Online (Sandbox Code Playgroud)

我认为在 Firestore 中引用用户记录是一种简单的方法。但是,也许 Firebase Auth 已经有办法做到这一点。我找不到文档或任何示例。

在上面的代码中,没有记录任何内容,并且用户被创建或登录。

如何阻止新用户注册,同时仍允许当前用户登录?

Lak*_*n S 15

如果你真的想使用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.

});
Run Code Online (Sandbox Code Playgroud)

这是简单的方法,但创建后删除不是最佳做法。还有一个选择,

你可以使用,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);
               }
          });
}
Run Code Online (Sandbox Code Playgroud)

是来自 firebase github repo 的示例。