当用户退出我的 Firebase 应用程序时,为什么它不也从身份验证提供商处退出,比如 Google?

Tal*_*lha 5 javascript firebase firebase-security firebase-authentication

我使用 Google 作为身份验证提供商来登录我的应用程序。我的代码调用了重定向到登录页面的 Firebase 注销方法,但是当用户再次点击 Google 登录按钮时,它会自动进行身份验证并登录到应用程序而不提示用户。这是登录的代码:

 $('#GooglePluseLogin').click(function (e) {
        showLoaderPF(true);
        if (!firebase.auth().currentUser) {

            var provider = new firebase.auth.GoogleAuthProvider();
            provider.addScope('https://www.googleapis.com/auth/plus.login');
            firebase.auth().signInWithRedirect(provider);


        } else {
            firebase.auth().signOut();
            showLoaderPF(true);
        }
    });
Run Code Online (Sandbox Code Playgroud)

而且,这是注销的代码:

firebase.auth().signOut().then(function () {
            debugger;
            localStorage.clear();
            deleteAllCookies();

           // firebase.auth().unauth();

            window.location.href = "index.html";

        }, function (error) {
            showLoaderPF(false);
            console.error('Sign Out Error', error);
        });
Run Code Online (Sandbox Code Playgroud)

wes*_*cpy 14

主要答案

@Shib提供的答案基本上是正确的,但没有为到达这里的每个人提供足够的背景信息,所以让我详细说明。当您的代码调用 时firebase.auth().signOut(),您会从您的应用程序中注销 Firebase,但不会从整个身份验证提供商注销(更多信息请参见下面的链接),因为您确实不想在其他选项卡中注销 Gmail 和其他 Google,对吗?

仅当您的浏览器缓存中只有一个Google 登录信息可用时,才会出现您遇到的问题。如果是这种情况,下次您使用 Firebase 身份验证登录时,它会自动重用相同的 Google 凭据(因为您没有退出 Google,而且确实如此),以便用户通过更少的鼠标点击来更快地登录。

IOW,对于过去使用 >1 个 Google/Gmail 帐户登录的用户来说这不是问题 - 这些用户将看到预期的帐户选择器对话框。如果您只有一个可用的 Google 登录名并且想要查看帐户选择器,则需要将自定义参数设置promptselect_account@Shib 指出的:

var provider = new Firebase.auth.GoogleAuthProvider();
  provider.setCustomParameters({
    prompt: 'select_account'
  });
Run Code Online (Sandbox Code Playgroud)

要了解有关通过 Firebase 身份验证进行 Google 登录的更多信息,请参阅此页面。这是一篇更详细地描述此行为的帖子。上面,@linasmnew @bojeil为什么他们评论说这是默认/预期行为(不退出身份验证提供程序),所以这里有一个提供解释的线程。

第 2 部分(仅限FirebaseUI 库使用):

如果您使用这个便利库(位于 Firebase 身份验证之上),如果您只有一个 Google 凭据,您也会遇到此问题,但解决问题的方法可能并不那么简单。该库的目的是提供一个可重用的预构建 UI,让用户可以从各种身份验证提供程序中进行选择,以减少开发人员时间并提供一致的用户体验。

开发人员不是像上面的主要答案那样实例化特定的身份验证提供程序类,而是在其配置中列出支持的提供程序 IDsignInOptions(具体为步骤 3)。(Python 3 Google App Engine“构建应用程序”快速入门示例使用 FirebaseUI,这就是遇到此问题的地方。)

例如,如果您决定仅使用 Google 和电子邮件身份验证,这些选项如下所示:

signInOptions: [
  firebase.auth.GoogleAuthProvider.PROVIDER_ID,
  firebase.auth.EmailAuthProvider.PROVIDER_ID,
  //firebase.auth.FacebookAuthProvider.PROVIDER_ID,
  //firebase.auth.TwitterAuthProvider.PROVIDER_ID,
  //firebase.auth.GithubAuthProvider.PROVIDER_ID,
  //firebase.auth.PhoneAuthProvider.PROVIDER_ID
],
            . . .
Run Code Online (Sandbox Code Playgroud)

这正是 App Engine 示例所做的事情,下面是代码。(这个 FirebaseUI JS 也可以嵌入到 HTML 中。)当这个 bug(嗯,“功能”)在这里出现不受欢迎的情况 时,添加该自定义参数以强制帐户选择器显示如下:prompt

signInOptions: [
  //firebase.auth.GoogleAuthProvider.PROVIDER_ID,
  {
    provider: firebase.auth.GoogleAuthProvider.PROVIDER_ID,
    customParameters: { prompt: 'select_account' },
  }
  firebase.auth.EmailAuthProvider.PROVIDER_ID,
  //firebase.auth.FacebookAuthProvider.PROVIDER_ID,
  //firebase.auth.TwitterAuthProvider.PROVIDER_ID,
  //firebase.auth.GithubAuthProvider.PROVIDER_ID,
  //firebase.auth.PhoneAuthProvider.PROVIDER_ID
],
            . . .
Run Code Online (Sandbox Code Playgroud)

  • 很高兴能帮助你。我也不知道答案,必须到处挖掘然后进行实验才能得出发布的解决方案。我觉得这个问题可能比人们想象的更普遍! (2认同)

小智 4

var provider = new Firebase.auth.GoogleAuthProvider();
  provider.setCustomParameters({
    prompt: 'select_account'
  });
Run Code Online (Sandbox Code Playgroud)