当未知用户尝试访问受保护的页面时,我遇到了竞争状态。
铁路由器代码:
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 ...});
如果用户直接进入/研究/请求,则存在竞争条件。
此时,我的解决方案是将clientId和其他linkedin配置信息中的硬编码转换为linkedin认证码(Yech)。
是否有更优雅/更正确的解决方案?
更新#1:我的解决方案是调整meteor-linkedin软件包,使其期望linkedIn clientId作为选项,并且不依赖于ServiceConfiguration.configuration。这样clientId始终可用。
答案 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-linkedin和accounts-meteor-linkedin
代码流星开发者aren't planning on fixing the issue。我同意这个决定,最好只在客户端上配置(常量)客户端配置,而不是存储在服务器上并发送给客户端。
更新:最后由于各种原因,我们几乎完全放弃了流星的oauth代码。使用弹出对话框的客户端中心方法导致了许多问题。 I talk about some of the issues on the 1911 bug report。我们最终在服务器端触发了oauth代码。