【问题标题】:When users SignOut of my Firebase app, why doesn't it also SignOut from the auth provider, say Google?当用户注销我的 Firebase 应用程序时,为什么它不从身份验证提供商(例如 Google)注销?
【发布时间】:2017-07-07 20:31:14
【问题描述】:

我使用 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);
        }
    });

还有,这里是登出的代码:

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

【问题讨论】:

  • 不清楚这里有什么问题。是您没有从 Google 提供商退出而仅从 Firebase 退出的问题吗?如果是这样,这是意料之中的。
  • 我也有这个问题。从 Firebase 退出不会从 Google 或类似情况退出。下次登录尝试将使用相同的凭据,并且用户无法更改用于登录的帐户(并且密码也以某种方式存储)退出按钮真的应该也忘记以前使用的密码,对吗?
  • 我现在使用GIDSignIn.sharedInstance().signOut() 来解决我的问题(因为我的应用目前使用谷歌身份验证),它让我在下次尝试时选择另一个帐户,但是有些东西(SFSafariViewController?)记住了密码在幕后......我猜用户可能必须在设置>Safari等中擦除某些内容才能删除该密码。
  • 嗨 @Jonny,什么是 GIDSignIn 对象?
  • @Talha 我使用 iOS 框架。我知道你不是,对不起。我还不太习惯 Firebase 系统,但也许 iOS 框架只是一个与 Web 工具相同/相似功能的包装器,所以我们共享同样的问题。

标签: javascript firebase firebase-authentication firebase-security


【解决方案1】:
var provider = new Firebase.auth.GoogleAuthProvider();
  provider.setCustomParameters({
    prompt: 'select_account'
  });

【讨论】:

    【解决方案2】:

    主要答案

    @Shib 提供的答案基本上是正确的,但没有为到达这里的每个人提供足够的上下文,所以让我详细说明一下。当您的代码调用 firebase.auth().signOut() 时,您会从您的应用程序中退出 Firebase,而不是整个身份验证提供程序(下面的链接中的更多内容),因为您真的不想在其他选项卡中退出 Gmail 和其他 Google对吧?

    只有当您的浏览器缓存中只有一个单个 Google 登录可用时,才会出现您遇到的问题。如果是这种情况,下次您使用 Firebase auth 登录时,它会自动重复使用相同的 Google 凭据(因为您没有退出 Google,而且也是如此),以使用户能够以更少的鼠标点击更快地登录.

    IOW,对于过去使用 >1 个 Google/Gmail 帐户登录的用户来说,这不是问题 - 这些用户将获得预期的帐户选择器对话框。如果您只有一个可用的 Google 登录名并且想要查看帐户选择器,则需要将 the prompt custom parameter 设置为 select_account,如 @Shib 所述:

    var provider = new Firebase.auth.GoogleAuthProvider();
      provider.setCustomParameters({
        prompt: 'select_account'
      });
    

    要详细了解如何通过 Firebase 身份验证进行 Google 登录,请参阅 this page。这是一个post,它更详细地描述了这种行为。上面,@linasmnewasked@bojeil 为什么他们评论说这是默认/预期的行为(不退出身份验证提供程序),所以here is a thread 提供那个解释。

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

    如果您使用的是这个便利库(位于 Firebase 身份验证之上),如果您只有一个 Google 凭据,您也会遇到此问题,但解决问题的方法可能并不那么简单。该库的目的是提供reusable prebuilt UI letting users choose from various auth providers 以减少开发人员的时间并提供一致的用户体验。

    开发人员 list out the supported provider IDs 在他们的 signInOptions 配置中(特别是第 3 步),而不是像上面的主要答案那样实例化特定的身份验证提供程序类。 (Python 3 Google App Engine "building an app" Quickstart example 使用 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
    ],
                . . .
    

    这正是 App Engine 示例所做的,here's the code。 (这个 FirebaseUI JS 也可以是 embedded in HTML。)当这个错误(嗯,“功能”)rears its undesired head here,添加 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
    ],
                . . .
    

    【讨论】:

    • 谢谢,@wescpy
    • 乐于助人。我也不知道答案,不得不到处挖掘,然后尝试得出发布的解决方案。我觉得这个问题可能比人们想象的更普遍!
    猜你喜欢
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2010-10-25
    • 2018-12-29
    相关资源
    最近更新 更多