Firebase $authWithOAuthRedirect 不会在页面刷新的情况下调用$onAuth



我有一个简单的Firebase Facebook OAuth登录设置如下通过Ionic Firebase Facebook登录的官方教程。

问题是,一旦我点击登录Facebook按钮,我被重定向到Facebook,我登录,我被重定向回我的应用程序。然而,问题是,我停留在登录页面。奇怪的是,如果我刷新我的浏览器(用ionic serve测试)按下F5的onAuth触发器,我得到重定向到Items页面。如果我不刷新浏览器,onAuth不会被调用。

有人有这个问题吗?你是怎么解决的?

请注意,是的,我做了我的研究(并且有点开始失去它),但不能让它工作。我搜索了SO,从谷歌组尝试了$timeout,试图调用$scope.$apply(),但都无济于事-所以请帮助我找出我在哪里做错了?

.controller('AppCtrl', function($scope, Items, Auth, $state, $ionicHistory) {
    $scope.login = function(provider) {
        Auth.$authWithOAuthRedirect(provider).then(function(authData) {
        }).catch(function(error) {
            if (error.code === "TRANSPORT_UNAVAILABLE") {
                Auth.$authWithOAuthPopup(provider).then(function(authData) {
                });
            } else {
                console.log(error);
            }
        });
    };
    $scope.logout = function() {
        Auth.$unauth();
        $scope.authData = null;
        $window.location.reload(true);
    };
    Auth.$onAuth(function(authData) {
        if (authData === null) {
            console.log("Not logged in yet");
            $state.go('app.login');
        } else {
            console.log("Logged in as", authData.uid);
            
            $ionicHistory.nextViewOptions({
                disableBack: true
              });
            $state.go('app.items');
        }
        $scope.authData = authData; // This will display the user's name in our view
    });
})
<ion-view view-title="Members area">
    <ion-content padding="true">
        <div ng-if="!authData">
            <button class="button button-positive button-block" ng-click="login('facebook')">Log In with Facebook</button>  
        </div>       
        
        <div ng-if="authData.facebook">
            <div class="card">
                <div class="item item-text-wrap">Hello {{authData.facebook.displayName}}!</div>                
            </div>
            <button class="button button-assertive button-block" ng-click="logout()">Log out</button>
        </div>        
    </ion-content>
</ion-view>

我使用$timeout: 解决了这个问题。
$timeout(function(){
    Auth.$onAuth(function(authData) {
        if (authData === null) {
            console.log("Not logged in yet");
            $state.go('app.login');
        } else {
            console.log("Logged in as", authData.uid);
            $ionicHistory.nextViewOptions({
                disableBack: true
              });
            $state.go('app.items');
        }
        $scope.authData = authData; // This will display the user's name in our view
    });
}, 3000);

然而,这只是感觉不对(委婉地说),必须有一个更好的方法,所以请建议一个。另外,我注意到惊人的3秒延迟几乎不够(我发现很少有资源建议500ms就足够了,但在我的情况下,情况并非如此)。

张贴在github问题上,但也会在这里回复。

这只发生在使用$authWithOAuthRedirect的浏览器中。这个例子是针对cordova应用程序的,所以这真的不应该是一个问题。

但是如果你真的需要它,你可以跳过重定向,使用一个弹出窗口。

    Auth.$authWithOAuthPopup(authMethod).then(function(authData) {
      console.dir(authData);
    });

这个bug已经在最新的Firebase JS客户端版本(2.3.0)中修复了。您现在可以使用$authWithOAuthRedirect,并且当您导航回页面时将触发$ auth回调。

相关内容

  • 没有找到相关文章

最新更新