铁路由器服务器端的Meteor.user()

时间:2013-11-26 14:19:01

标签: meteor iron-router

如何在服务器端路由上检查是否记录了用户?

我会在'之前'添加检查,但是Metor.user()在这里不起作用。

提前感谢。

P.S。我找到了How to get Meteor.user() to return on the server side?,但没有找到铁路由器

2 个答案:

答案 0 :(得分:8)

我担心这是不可能的。我想这个问题来自于你试图用两种不同的协议连接到服务器 - 从字面上和逻辑上 - 所以没有明显的方法来联系这两个行为。

但是,有一个非常简单的解决方案可以满足您的需求。您需要开发一个简单的特权令牌系统,或秘密密钥,或任何您称之为的密钥。首先,创建一个服务器方法

var Secrets = new Meteor.Collection("secrets"); // only on server!!!

Meteor.methods({
  getSecretKey: function () {
    if (!this.userId)
      // check if the user has privileges
      throw Meteor.Error(403);
    return Secrets.insert({_id: Random.id(), user: this.userId});
  },
});

然后,您现在可以在客户端上使用它来获取附加到secretKey请求(或其他内容)的AJAXHTTP标头内或{{ 1}}本身。不要害怕! 如果您使用的是URL,则会对所有内容进行加密。

在服务器端,您现在可以从传入请求中检索HTTPS,并检查它是否存在于secretKey集合中。您将知道用户是否被授予某些特权。 此外,出于安全原因,您可能需要在一段时间后从集合中删除您的密钥。

答案 1 :(得分:3)

如果您要做的是验证发出请求的Meteor.user,我目前正在IronRouter.route()的上下文中执行此操作。必须在标头中使用有效的用户ID和身份验证令牌进行请求。我在Router.route()中调用此函数,然后让我访问this.user:

###
  Verify the request is being made by an actively logged in user
  @context: IronRouter.Router.route()
###
authenticate = ->
  # Get the auth info from header
  userId = this.request.headers['x-user-id']
  loginToken = this.request.headers['x-auth-token']

  # Get the user from the database
  if userId and loginToken
    user = Meteor.users.findOne {'_id': userId, 'services.resume.loginTokens.token': loginToken}

  # Return an error if the login token does not match any belonging to the user
  if not user
    respond.call this, {success: false, message: "You must be logged in to do this."}, 401

  # Attach the user to the context so they can be accessed at this.user within route
  this.user = user

  ###
    Respond to an HTTP request
    @context: IronRouter.Router.route()
  ###
  respond = (body, statusCode=200, headers={'Content-Type':'text/json'}) ->
    this.response.writeHead statusCode, headers
    this.response.write(JSON.stringify(body))
    this.response.end()

这段代码深受RestStop和RestStop2的启发。它是在Meteor 0.9.0+(构建在Iron Router之上)编写REST API的流星包的一部分。您可以在这里查看完整的源代码:

https://github.com/krose72205/meteor-restivus