直接进入安全页面时的竞争条件

时间:2014-03-10 18:05:32

标签: meteor iron-router

当未知用户尝试访问受保护的页面时,我遇到了竞争状态。

铁路由器代码:

function secured() {
    if ( Meteor.user() == null ) {
        Meteor.loginWithLinkedin({
        },function (err){
            if(err){
                console.log("Error when login with LinkedIn."+JSON.stringify(err));
            }
        });
    }
}

Router.map(function () {this.route('customer_researchRequest', {
    before: secured,
    waitOn: waitOnHuman,
    path: '/research/request',
    template: 'customer_researchRequest',
    layoutTemplate: 'customer_requestLayout'
});});

在服务器上:

    ServiceConfiguration.configurations.remove({
        service: 'linkedin'
    });

    ServiceConfiguration.configurations.insert({... settings ...});

如果用户直接进入/研究/请求,则存在竞争条件。

  1. 在条件触发之前
  2. (在客户端上)ServiceConfiguration.configurations没有配置
  3. 客户端有关于没有定义任何服务的例外。
  4. 服务器将ServiceConfiguration.configurations发布到客户端
  5. 此时,我的解决方案是将clientId和其他linkedin配置信息中的硬编码转换为linkedin认证码(Yech)。

    是否有更优雅/更正确的解决方案?

    更新#1:我的解决方案是调整meteor-linkedin软件包,使其期望linkedIn clientId作为选项,并且不依赖于ServiceConfiguration.configuration。这样clientId始终可用。

2 个答案:

答案 0 :(得分:0)

编辑发表评论:

也许不同的反应使用可能有所帮助。设置延迟重定向到customer_researchRequest,首先转移用户,然后启动它们

A)secure()将原始目标路径保存到会话中。重定向到您没有安全性的页面(或“正在加载...”页面),以避免您的#3
B)当登录回调发生时,将另一个标志保存到会话中,表明#4不再为真 C)当两个标志变为真时,将Deps.autorun重定向到所需的路径。

其他人可能知道更聪明的方式,(也许waitOn应该测试配置)但是......

答案 1 :(得分:0)

最好的解决方案原来是我的" hack"创建一个forked meteor-linkedin,它接受登录调用中的客户端配置。

我们编辑了meteor-linkedin,以便Meteor.loginWithLinkedIn()调用提供了linkedIn clientId。

目前,Meteor的ServiceConfiguration存储在mongo表中,需要从服务器发布到客户端。 clientId本质上是一个静态配置变量,可以编码到客户端代码中。只需将linkedin clientId直接放在登录代码中,就会变得更加可靠和简单。

即使Meteor要修复'在出版竞争条件下,我们会坚持我们的解决方案:它是防弹的,并保证工作。您可以借用我们的meteor-linkedinaccounts-meteor-linkedin

代码

流星开发者aren't planning on fixing the issue。我同意这个决定,最好只在客户端上配置(常量)客户端配置,而不是存储在服务器上并发送给客户端。

更新:最后由于各种原因,我们几乎完全放弃了流星的oauth代码。使用弹出对话框的客户端中心方法导致了许多问题。 I talk about some of the issues on the 1911 bug report。我们最终在服务器端触发了oauth代码。