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

Pat*_*Pat 8 meteor iron-router

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

请注意这是一条看起来像这样的路线:

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

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

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

Ale*_*hes 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()允许与存储在DB中的散列令牌匹配的函数对原始Meteor登录令牌进行哈希处理.


Aks*_*hat 6

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

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

如果要以您正在执行的方式访问标头中的值,则必须在用户使用用户令牌登录时设置cookie.

用户令牌位于localstorage/Meteor.loginToken&user Id at 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连接.

Meteor的调用和订阅方法使用此登录进行身份验证,以在服务器上发布所有在DDP线路上发生的方法.

这个答案应该详细说明如何进行登录:通过DDP(和SRP?)通过Meteor进行身份验证

  • 请原谅我:但这个答案听起来不完整.显然,Meteor.publish和Meteor方法知道当前用户.不能强迫服务器盲目信任客户端.服务器必须发出任何登录令牌并与用户协调任何HTTP请求. (2认同)
  • 首先是:你不应该使用`iron-router`作为服务器端路由.它只是不酷;)我不知道你究竟想要在这里实现什么,但为了以防你可能感兴趣我[附加一个链接](https://github.com/apendua/meteor-uploader/ blob/master/server.js)我前面正在研究的一个示例项目.它显示了如何使用令牌在服务器端路由上对用户进行身份验证. (2认同)