【问题标题】:Meteor Iron-router server-side only route how to get the current user?Meteor Iron-router server-side only route 如何获取当前用户?
【发布时间】:2014-07-17 18:36:06
【问题描述】:

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

请注意,这条路线看起来像:

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

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

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

【问题讨论】:

  • 为什么要这样做?非客户端用户何时会调用服务器端路由?
  • 很多情况:1) 加书签的 url,2) 来自外部服务的 302 次反弹重定向,3) 或 .... 仅在服务器上处理的 Iron-router 路由

标签: meteor iron-router


【解决方案1】:

这在 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 登录令牌进行哈希处理,该函数允许与存储在数据库中的哈希令牌匹配。

【讨论】:

  • 请注意,默认情况下cookie可能不可用,至少在0.9中。例如,要使 cookie 可用,您可以添加 meteorhacks:fast-render
  • 我正在尝试验证来自服务器端路由的用户请求,是否有另一种方法可以在不安装 meteorhacks:fast-render 的情况下使 cookie 可用(我不想再安装另一个包只是为了这个)?
  • @aaron meteorhacks:fast-render 是一个非常重要的包。我不会担心添加它。
  • @MichaelCole 抱歉,但由于创始人/开发人员退出流星并进入 Facebook 堆栈,meteorhacks 基本上已经关闭。无论如何,它不是必不可少的软件包。此外,无论来源如何,您都应该担心添加任何不受支持和未开发的库。谢谢。
  • @aaron,它是开源的。人们继续前进是可悲的,但不是抱怨他们没有给我们免费工作的借口。加强。
【解决方案2】:

如果您在登录时不在客户端设置 cookie,您实际上无法在服务器端执行此操作。

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

如果您想以您正在做的方式访问标头中的值,则必须在用户使用用户令牌登录时设置一个 cookie。

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

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

这样做有一个相当大的安全警告,因为您的 loginToken 暴露程度更高,可用于访问帐户。

Meteor 如何处理登录

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

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

Meteor 的调用和订阅方法使用此登录来验证以在服务器上发布方法,这一切都发生在 DDP 线上。

此答案应详细说明登录方式:Authenticating with Meteor via DDP (and SRP?)

【讨论】:

  • 对不起:但这个答案听起来不完整。显然,Meteor.publish 和 Meteor 方法知道当前用户。不能强迫服务器盲目信任客户端。服务器必须发出任何登录令牌并与用户协调任何 HTTP 请求。
  • 嗨 - 我不明白使用 localstorage 比使用 cookie 更安全。令牌位于不可信的客户端上,可能会被泄露。 cookie 的最大问题是不受信任的子域。也就是说,safari 在隐私浏览模式下无论如何都不允许本地存储 - 因此 Meteor 必须具有非本地存储故障回复机制才能可靠。叹。看来我必须深入研究并破解一个简单的解决方案。
  • 您的问题已被至少多次询问。如果您对@Akshat 的回答不满意,尽管它的解释很好,请查看this one,它显示了一个非常简单的解决方案,可以帮助您解决问题。
  • 第一件事是:您不应该将iron-router 用于服务器端路由。它只是不酷;)我不知道你究竟想在这里实现什么,但以防你可能感兴趣,我是attaching a link 我前段时间正在研究的一个示例项目。它展示了如何使用令牌在服务器端路由上对用户进行身份验证。
  • @apendua- 你的评论现在真的错了(github.com/EventedMind/iron-router/blob/devel/Guide.md)——就像我知道的那样。服务器端路由对于许多用例(包括 Web 挂钩和 oauth 身份验证)至关重要。
猜你喜欢
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
  • 2015-04-06
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多