【问题标题】:Firebase Facebook Authentication - re-request permissionsFirebase Facebook 身份验证 - 重新请求权限
【发布时间】:2015-04-16 12:39:51
【问题描述】:

当用户通过 Facebook 进行身份验证时,他们可以选择拒绝所要求的权限。

Facebook 允许我们通过添加以下内容来重新请求许可:auth_type: 'rerequest' (https://developers.facebook.com/docs/facebook-login/login-flow-for-web/v2.0#re-asking-declined-permissions)

我找不到重新请求最初使用 Firebase 拒绝的权限的方法。

有人知道怎么做吗?

贾罗德

【问题讨论】:

  • 在我们的后端向 Facebook 发出请求时,我们没有做任何特别的事情。所以很遗憾,我们目前不提供此功能。这实际上是我第一次听到它,并且一定是一个新功能(我猜是因为他们允许部分接受权限)。如果我们有足够多的人询问这个问题,我们将考虑实施它。不过,我不确定它是否适合我们当前的工作流程。
  • 解决此问题的一种方法是直接使用 Facebook OAuth 进行身份验证,并将生成的令牌传递到 Firebase 的 authWithOAuthToken()。

标签: facebook login permissions firebase


【解决方案1】:

您可以使用setCustomParameters 设置自定义提供程序值。在这种情况下,您要做的就是像下面这样调用它来重新请求权限。

provider.setCustomParameters({
  auth_type: 'rerequest'
});

文档链接:https://firebase.google.com/docs/auth/web/facebook-login

【讨论】:

    【解决方案2】:

    更新:最佳解决方法

    Facebook 登录:用户单击 Facebook 登录按钮并拒绝所需的权限或在 Facebook 弹出登录窗口中选择“不立即”。用户已登录您的网站,但您希望确保用户授权您所需的权限。

    在您的 signInSuccess 回调中:如果用户登录并拒绝您的权限,您应该立即从您的 Facebook 应用中删除您的用户。

    然后立即注销您的用户;强制再次登录尝试。

    用户将尝试再次登录,Facebook 将再次请求权限。这一直持续到用户允许或放弃。这就是我正在运行的内容。

    var usersFacebookToken = credential.accessToken;
    var fbPermissionsUrl = `https://graph.facebook.com/me/permissions?access_token=${usersFacebookToken}`
    
    $http.get(fbPermissionsUrl)
        .then(function(response) {
            let facebookPerms = response.data.data;
    
            facebookPerms.forEach(function(item) {
                if (item.permission === 'email' && item.status === 'declined' || item.permission === 'user_posts' && item.status === 'declined') {
                    console.log(`${item.permission} denied`)
                        // remove user from my facebook app
    
                    $http({
                        method: 'POST',
                        url: `https://graph.facebook.com/me/permissions?method=delete&access_token=${fbUserAccessToken}`
                    }).then(function successCallback(response) {
                        // this user has been deleted from the FACEBOOK APP
                        // when user does Facebook login/signup again
                        // then permissions will be requested again
                        return true;
    
                    }, function errorCallback(error) {
                        // called asynchronously if an error occurs
                        // or server returns response with an error status.
                        console.error(error)
                    });
    
                    alert("Email and user posts history are required")
                    delete $scope.currentUser;
                    firebase.auth().signOut();
                }
            })
    
        });
    

    上一个

    我已经实现了 customParameters,它们确实会传递给 Facebook,但即使在使用 auth_type: 'reauthenticate' or auth_type: 'rerequest' 时,也不会再次提示用户允许权限。

    我将研究从我的 Facebook 应用程序中删除用户,然后再次提示登录。引用此线程:Is there a way to delete users for your Facebook Application? 到那时……

    解决方法:让用户删除您在 Facebook 注册的应用,然后再次登录您的网站。然后将提示用户通过范围授权您请求的任何权限。

    将用户引导至此处,让他们找到您的应用,然后单击模式底部小字体中的“删除应用”: https://www.facebook.com/settings?tab=applications

    这是对传递 customParameters 的引用: 查看 Github 上的链接:https://github.com/firebase/firebaseui-web#configure-oauth-providers

        {
      provider: firebase.auth.FacebookAuthProvider.PROVIDER_ID,
      scopes: [
        'public_profile',
        'email',
        'user_likes',
        'user_friends'
      ],
      customParameters: {
        // Forces password re-entry.
        auth_type: 'reauthenticate'
      }
    },
    

    下面是我如何指示我的用户删除我在 Facebook 上的应用

    1. 第 1 步 - 转到此链接
    2. 第 2 步 - 找到应用 TEFL.pro
    3. 第 3 步 - 点击模式底部的删除应用程序
    4. 第 4 步 - 再次使用 Facebook 登录

    是的,我知道用户不会这样做,但在 FirebaseUI 正确重新请求权限之前,我会走这条路。如果我失去了一个从一开始就没有授权所需权限的用户,那就这样吧。我在这里使用帕累托原理

    【讨论】:

      【解决方案3】:

      我现在没有答案,但是... 也只是偶然发现这一点,如果用户拒绝给他的电子邮件应用程序进入一个循环,在没有电子邮件的情况下进行登录,并且不给用户一个允许用户允许信息的机会。 在我看来,这是 firebase facebook oauth 的一个相当不足的地方。我将开发我的应用程序,希望没有用户会拒绝电子邮件信息。

      Firebase facebook oauth 必须包含对 auth_type=rerequest 的支持才能解决此问题。

      【讨论】:

        猜你喜欢
        • 2011-02-28
        • 2013-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-27
        • 2012-05-01
        • 2017-01-30
        相关资源
        最近更新 更多