流星铁路由器登录路由Pass-thru Facebook帐户无效

时间:2017-06-08 20:51:50

标签: meteor iron-router meteor-accounts

问题:

当我使用标准电子邮件/密码'accounts-password'的普通用户进入登录重定向页面时,他们可以输入凭据,路由器将继续呈现所请求的页面。

例如: / private_page(需要登录)。用户尝试转到http://foo.com/private_page,并显示登录页面。用户正确输入用户名/密码,现在显示/ private_page。

这有效,什么不起作用......

与上面相同的例子,但现在用户正在使用Facebook'accounts-facebook'进行身份验证。一切都和以前一样,用户使用Facebook成功登录,并且能够进入我的Web应用程序,除了路由从不显示/ private_page。它保留在经过身份验证的/登录页面上,而不显示登录模板。

在坚果中 如何让经过身份验证的Facebook用户通过并路由到所请求的路由,就像基于常规密码的用户操作一样?

铁路由器配置:

Router.onBeforeAction(function () {    
    if  (!Meteor.userId() && !Meteor.loggingIn()) {
        this.redirect('login');
        this.stop();
    } else {
        this.next();
    }
},{except: ['login', 'contact, 'terms']});

流星套餐:

accounts-password@1.3.6
accounts-facebook@1.2.0
service-configuration@1.0.11
useraccounts:bootstrap
useraccounts:iron-routing

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方案。

在审查了Meteor软件包的Github问题之后:( meteor-useraccounts)我发现了我遇到的确切问题。

https://github.com/meteor-useraccounts/core/issues/685

我花了太多时间尝试使用Meteor使用oAuth Facebook来正确解锁。我的最终解决方案也是直接连接到Meteor方法调用并创建我自己的登录,注册,密码重置等表单。

最重要的是,我现在可以完全控制表格,而且我不需要处理额外的包裹。

如果有人发现此帖子,并且在制作“流星使用计划”等问题时遇到问题。像postSignUpHook这样的消防钩子,您可能决定废弃包裹并制作自己的用户帐户模板并连接逻辑以使用本地Meteor方法。

我提交的这个特殊问题是因为oAuth Facebook会登录,但我无法将其重定向到最初请求的路线。 oAuth工作,我的用户可以登录我的网络应用程序,但我无法将它们转到最初请求的网址。

我是如何解决这个问题的:

LIB /路由

Router.onBeforeAction(function () {    
    if  (!Meteor.userId() && !Meteor.loggingIn()) {
        originalUrl = this.originalUrl;
        this.redirect('login');
        this.stop();
    } else {
        this.next();
    }
},{except: ['login', 'resetPwd', 'help'] });

从上面的代码片段中取消的关键点是我声明 originalUrl 的全局变量。这是使用路由器 this.originalUrl 。此网址包含用户输入的原始网址,并在铁路由器重定向到登录页面之前捕获。

现在在登录页面上,我使用自己的自定义模板创建了两种不同的登录方法。他们都使用 Meteor.loginWithPassword Meteor.loginWithFacebook 方法。

的客户机/ login.js

    'click #fb-login' : function(e){
        e.preventDefault();
        Meteor.loginWithFacebook({}, function(err){
            if(err) {
              // some error occured
            }
            else {
                if(Router.current().route._path == "/login" && typeof originalUrl == "undefined")
                    Router.go('/');
                else
                    Router.go(originalUrl);
            }
        });
    }

希望这有助于其他可能遇到此问题的人。