Meteor Iron-router服务器端只有路由如何获取当前用户?

时间:2014-04-23 18:39:38

标签: meteor iron-router

对于仅服务器路由,如何获取当前用户。

请注意,这条路线如下:

    this.route('report_access', {
      path: '/report/:humanId?/:reportKey',
      where: 'server',
      action: ....
   });

这不在发布或方法调用中,因此Meteor.user()/ Meteor.userId()失败。

我查看了route.params并且没有设置用户ID。

2 个答案:

答案 0 :(得分:8)

这适用于我:0.8:

if(this.request.cookies.meteor_login_token) u = Meteor.users.findOne({"services.resume.loginTokens.hashedToken": Accounts._hashLoginToken(this.request.cookies.meteor_login_token)});

我基本上使用Accounts._hashLoginToken()函数对原始Meteor登录令牌进行哈希处理,该函数允许与存储在数据库中的哈希令牌进行匹配。

答案 1 :(得分:6)

如果没有在登录时在客户端设置cookie,则无法在服务器端执行此操作。

Meteor将用户的身份验证令牌存储在localStorage中,这在HTTP标头阶段不可用,仅在页面加载到客户端javascript之后。

如果您想以类似的方式访问标题中的值,则必须在用户使用用户令牌登录时设置cookie。

用户令牌位于localstorage / Meteor.loginToken&用户ID Meteor.userId()

然后使用请求标头检查此值,并在位于users的mongodb的services.resume.loginToken集合中的用户存储的令牌中找到令牌。

执行此操作存在相当大的安全警告,因为您的loginToken更具公开性,可用于访问该帐户。

Meteor如何使用登录

Meteor通过websockets建立DDP连接。当网页加载了之前“已保存”的登录状态时,将使用带有localstorage api的javascript读取这些loginTokens。 DDP是Meteor用于与服务器通信的websockets或sockj上的通信层。

在加载javascript后,通过DDP协议进行登录。这是您不能直接使用服务器端路由执行此操作的主要原因,因为您无法以这种方式访问​​DDP,因为Meteor的库不可用,并且在发送http请求时此时未建立DDP连接。 / p>

Meteor的电话& subscribe方法使用此登录进行身份验证,以在服务器上发布所有在DDP线上发生的方法。

此答案应详细说明登录的具体情况:Authenticating with Meteor via DDP (and SRP?)