对于仅服务器路由,如何获取当前用户。
请注意,这条路线如下:
this.route('report_access', {
path: '/report/:humanId?/:reportKey',
where: 'server',
action: ....
});
这不在发布或方法调用中,因此Meteor.user()/ Meteor.userId()失败。
我查看了route.params并且没有设置用户ID。
答案 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通过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?)