流星服务器中的每请求会话?

时间:2017-05-07 03:26:45

标签: node.js meteor connect

我正在添加一个auth图层,我想除了一个棘手的细节之外我已经弄清楚了。 我的Meteor应用程序没有任何路由,但我已经在连接中间件中添加了一个钩子,以便" /"如果没有正确的API令牌,则会出现路由错误。如果令牌没问题,那么我打电话next()将路线转发给Meteor。

问题在于,根据令牌,我需要为连接设置服务器端参数,而我不知道如何执行此操作。例如,假设我有一个映射到权限级别的静态API密钥列表。如果用户使用" ADMIN_API_KEY"发送请求然后我想设置Session.permission_level = "admin"以供Meteor服务器的功能使用。 Session仅适用于Meteor中的客户端。

  # this code's in coffeescript

  WebApp.connectHandlers.use '/', (req, res, next) ->
    validator = new RequestValidator(req, next)
    validations = [
      "valid_namespace",
      "only_https"
    ]
    error = validator.validate(validations)
    next(error)
    # <<<<<<<<<<<<<<<<<<<<<<<<
    # Here I want to set some config option which can be
    # read by the server in the same way it can read things like
    # Meteor.user()

在Rails中,我只想说session[:permission_level] = "admin"。但它似乎在Meteor中不起作用。

顺便说一下,我还没有在Meteor中使用路由包,不过如果这样做会比我更容易。

1 个答案:

答案 0 :(得分:1)

我不确定Session我做过像

这样的事情
import { DDP } from 'meteor/ddp';
import { DDPCommon } from 'meteor/ddp-common';

export const authMiddleware = (req, res, next) => {
  const userId = identifyUser(req); // parse the request to get the token you expect
  if (!userId) {
    return next();
  }

  DDP._CurrentInvocation.withValue(new DDPCommon.MethodInvocation({
    isSimulation: false,
    userId,
  }), () => {
    next();
    // in that context, Meteor.userId corresponds to userId
  });
};

对于我的REST api,这对于用户ID很有效,并且能够调用应该在DDP上下文中调用的Meteor函数,例如Users.find(...)