【问题标题】:Ember.js + Node.js Authentication/Session Not Working with Express.SessionEmber.js + Node.js 身份验证/会话不适用于 Express.Session
【发布时间】:2013-03-23 01:14:56
【问题描述】:

我一直在试验 Ember.js 和 Node.js,但遇到了问题。我已经使用标准的Express.session 系统保护了服务器上的 API 路由,但是当这些 API 为 Ember.js 应用程序提供服务时我遇到了问题。由于 Ember 应用程序无法在 req.session 中存储值,因此我的应用程序无法运行。我应该如何进行身份验证,以便我仍然可以对我的 API 进行会话保护?这是我当前的一些服务器登录代码:

“检查登录”功能:

var checkLogin = function(req, res, callback) {
    if (req.session.user) {
      callback();
    } else {
      res.send({error: "AuthRequired"});
    }
  };

Ember 发出请求时出错:

TypeError: Cannot read property 'user' of undefined

中间件设置:

app.configure(function () {
  app.use(express.bodyParser());
  app.use(express.static(__dirname + '/static/'));
  app.use(express.cookieParser(<SECRET>));
  app.use(express.session());
  //to not care about invalid JSON requests
  app.use(function(err, req, res, next) {
    if (err.message == 'invalid json')  {
        next()
    } else {
        next(err)
    }
  });
});

【问题讨论】:

  • 能否发布您的 Express 应用配置(中间件等)?
  • 更新了中间件信息。
  • 你是不是在 你的路由之后声明你的中间件?否则,我不明白为什么 req.session 可以未定义(当客户端不发送会话 cookie 时,仍然会创建 req.session,只是一个空的)。
  • 不。我的路线是在中间件设置之后。奇怪吧?请参阅下面的线程;我认为这是因为该应用没有为 AJAX 客户端设置会话。
  • 是的,确实很奇怪。我记得发生了同样情况的一个案例,但这与一个中间件 (i18next) 相关,该中间件 (i18next) 在内部将 app.router 推送到中间件堆栈上,加载其他与会话相关的中间件之前,但您的代码似乎并非如此。

标签: ajax node.js session express ember.js


【解决方案1】:

你试过Passport吗?
这个中间件将用户添加到您的会话中,我建议尝试它的passport-local 提供程序。
网站上的指南可能不是完整的工作代码,您最好参考 git repo 上的example 文件夹。

更新: 可能是配置顺序不对。 这是我对Locomotive 服务器的配置(将this 替换为app),试试看。

this.use(poweredBy(null));
this.use(express.favicon());
this.use(express.logger('dev'));
this.use(express.compress());
this.use(express.cookieParser());
this.use(express.static(__dirname + '/../../public'), { maxAge: 60*10*1000 });
this.use(express.bodyParser());
this.use(express.methodOverride());
this.use(express.session({ secret: '<SECRET>' }));
// Initialize Passport!  Also use passport.session() middleware, to support
// persistent login sessions (recommended).
this.use(flash());
this.use(passport.initialize());
this.use(passport.session());
this.use(this.router);

【讨论】:

  • 问题是我之前遇到的问题:来自客户端的 AJAX 请求仍然没有 cookie/会话。我可能会为请求实现我自己的简单令牌系统。
  • 我怀疑可能是设置问题,您是否尝试运行passport-local 示例代码?
  • 我的意思是护照的会话存储在请求中(我认为)。这意味着当客户端发出请求时,它会检查会话变量是否存储在该请求中。当我登录我的服务时,它会在浏览器上设置一个 cookie(我认为)。但是,当我从 Ember 客户端发出请求时,AJAX 不是来自我的浏览器,也无法访问我的 cookie。如果我错了,请纠正我,但这可能是我的系统目前无法正常工作的原因。
  • AFAIK,当用户代理(阅读:浏览器)连接到服务器时,会创建一个会话 ID。此 ID 在客户端存储为 cookie cookie,然后用于在 MemoryStore 中查找信息。 req.session.user 是存储在 MemoryStore 中的对象。
    AJAX 也是 HTTP,因此应该已经发送了 cookie,您能否检查 sid cookie 是否在 WebInspector/Firebug 的请求标头上?
    How do sessions work in Express with NodeJs?
  • 听起来不像菜鸟,但我该如何检查呢?
猜你喜欢
  • 2022-10-03
  • 1970-01-01
  • 2016-08-04
  • 2016-01-22
  • 2011-09-27
  • 2014-09-20
  • 2021-04-02
  • 2020-10-06
  • 1970-01-01
相关资源
最近更新 更多