Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax Ember.js+;Node.js身份验证/会话无法使用Express.Session_Ajax_Node.js_Session_Express_Ember.js - Fatal编程技术网

Ajax Ember.js+;Node.js身份验证/会话无法使用Express.Session

Ajax Ember.js+;Node.js身份验证/会话无法使用Express.Session,ajax,node.js,session,express,ember.js,Ajax,Node.js,Session,Express,Ember.js,我一直在尝试Ember.js和Node.js,但遇到了一个问题。我已经用标准的Express.session系统在服务器上保护了我的API路由,但是当这些API为一个Ember.js应用程序服务时,我遇到了一个问题。由于Ember应用程序无法在req.session中存储值,因此我的应用程序无法运行。我应该如何进行身份验证,以便仍然可以对API进行会话保护?以下是我当前的一些服务器登录代码: 一个“检查登录”功能: var checkLogin = function(req, res, call

我一直在尝试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"});
    }
  };
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)
    }
  });
});
余烬发出请求时出错:

var checkLogin = function(req, res, callback) {
    if (req.session.user) {
      callback();
    } else {
      res.send({error: "AuthRequired"});
    }
  };
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)
    }
  });
});
中间件设置:

var checkLogin = function(req, res, callback) {
    if (req.session.user) {
      callback();
    } else {
      res.send({error: "AuthRequired"});
    }
  };
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)
    }
  });
});
app.configure(函数(){
app.use(express.bodyParser());
应用程序使用(express.static(uu dirname+/static/);
use(express.cookieParser());
app.use(express.session());
//不关心无效的JSON请求
应用程序使用(功能(错误、请求、恢复、下一步){
if(err.message==“无效json”){
下一个()
}否则{
下一个(错误)
}
});
});
你试过了吗?
此中间件将用户添加到您的会话中,我建议尝试其
passport-local
提供程序。
网站上的指南可能不是完全有效的代码,您最好参考git repo上的
示例
文件夹

更新: 可能是配置的顺序不正确。 这是我对
机车
服务器的配置(将
替换为
应用程序
),请试用

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);
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:'}));
//初始化护照!还可以使用passport.session()中间件来支持
//持久登录会话(推荐)。
使用(flash());
使用(passport.initialize());
使用(passport.session());
使用(这个路由器);
你试过了吗?
此中间件将用户添加到您的会话中,我建议尝试其
passport-local
提供程序。
网站上的指南可能不是完全有效的代码,您最好参考git repo上的
示例
文件夹

更新: 可能是配置的顺序不正确。 这是我对
机车
服务器的配置(将
替换为
应用程序
),请试用

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);
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:'}));
//初始化护照!还可以使用passport.session()中间件来支持
//持久登录会话(推荐)。
使用(flash());
使用(passport.initialize());
使用(passport.session());
使用(这个路由器);


你能发布你的Express应用程序配置(中间件等)吗?用中间件信息更新。是不是你在路由后声明了你的中间件?否则,我不明白为什么
req.session
可以不定义(当客户端不发送会话cookie时,仍然会创建
req.session
,只是一个空的会话)。不。我的路由在中间件设置之后。奇怪吧?请参阅下面的线程;我认为这是因为应用程序没有为AJAX客户端设置会话。是的,确实很奇怪。我记得有一个案例发生了同样的情况,但这与一个中间件(
i18next
)有关,该中间件在加载另一个与会话相关的中间件之前,在内部将
app.router
推到中间件堆栈上,但您的代码似乎不是这样。您可以发布您的Express app配置吗(中间件等)?用中间件信息更新。可能是您在路由后声明了中间件吗?否则,我不明白为什么
req.session
可以不定义(当客户端不发送会话cookie时,仍然会创建
req.session
,只是一个空的会话).Nope.我的路线是在中间件设置之后。奇怪吧?请看下面的线程;我认为这是因为应用程序没有为AJAX客户端设置会话。是的,确实很奇怪。我记得有一个案例发生了同样的情况,但这与一个中间件有关(
i18next
)在加载其他与会话相关的中间件之前,它在内部将
app.router
推到中间件堆栈上,但您的代码似乎不是这样。问题在于,这正是我之前遇到的问题:来自客户端的AJAX请求上仍然没有cookie/会话。我可能要实现它我自己的简单令牌系统用于请求。我怀疑这可能是设置问题,您是否尝试运行
passport local
示例代码?我的意思是passport会话存储在请求中(我想)。这意味着当客户端发出请求时,它会检查该请求中是否存储了会话变量。当我登录到我的服务时,它会设置一个cookie(我想)在浏览器上。但是,当我从我的Ember客户端发出请求时,AJAX不是来自我的浏览器,并且没有访问我的cookie的权限。如果我错了,请更正我的错误,但这可能是我的系统当前无法工作的原因。好吧,当用户代理(读取:browser)时会创建会话ID连接到服务器。此ID在客户端存储为cookie cookie,然后用于在MemoryStore中查找信息。
req.session.user
是存储在MemoryStore中的对象。
AJAX也是HTTP,因此cookie应该已发送,您是否可以检查