Tag: 会话

Express.js / Passport应用程序为每个请求创build新的会话,尽pipe会话ID在请求标头中

之前没有注意到这一点,因为对于客户端 – 服务器通信,通过XHR(至今)还没有需要validation的事情。 在实现一些集成testing时,我正在创buildrealy请求node-xmlhttprequest到应用程序的一个实例。 用户在第一个请求中被authentication,理论上用户的唯一标识符和一些其他相关信息被存储在会话中(正如我所说的,这对于真正的客户端来说很好,他们不需要通过XHR来确认他们的身份)。 出于某种原因,即使随后的请求正在使用完全相同的会话ID触发,我无法在后续请求中检索会话,因此无法看到用户已通过身份validation,这导致失败的testing,其中预期的行为不会发生,HTTP 401 UNAUTHORIZED正在填满terminal。 我见过几个这样的问题,但是“同一个会话ID”似乎并不存在于其中。 我是否需要手动添加Set-Cookie头到所有的XHR请求? 太糟糕了,还有更好的办法! 所以人们喜欢源代码,这里有一些来自testing,发出这些请求: // Ensure logged in before sending request, to verify that authorized // users encounter the expected behaviour. jQuery.post(domain+'/login', {email:'test@express.app', password:'12345678'}, function(data,x,y){ data.should.equal("true") jQuery.ajax({url:domain+'/event', type:"POST", name: "TestEvent", location: "TestVille", startDate: new Date('2013-09-01'), startTime: '6:45 pm', description: "Test Event #1", success: state.success, error: state.error, completed: […]

如何在node.js中使用Passport访问序列化用户

我已经能够使用Passport进行身份validation,但是我不知道如何访问序列化的用户。 我已经读了几个地方,访问它的方式是与req.user,但是当我尝试与GET /你好,它说,用户是未定义的… 这是我的app.js var express = require('express'); var routes = require('./routes'); var user = require('./routes/user'); var authentication = require('./routes/authentication'); var content = require('./routes/content'); var posts = require('./routes/post.js'); var upload = require('./routes/upload.js'); var media = require('./routes/media.js'); var http = require('http'); var path = require('path'); var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; var mongoose = […]

NodeJS(Express.js):如何使会话全局

我知道全局variables在JavaScript和整体编程方面是一个不好的做法,但是我想让我的用户会话在我的express.js应用程序中可用,避免必须从我的控制器传递会话参数到我的模型。 我怎么能最好的做到这一点? 谢谢!

如何在没有框架的情况下处理node.js中的会话

我正在开发SPA(单页networking应用程序); 这个想法是轻量级的,并没有使用太多的框架和抽象和东西,所以我创build了静态+dynamic文件的HTTP服务器,它运作良好。 现在我已经在web应用程序中实现了socket.io,但是我想知道你认为什么是处理会话的好方法(请记住,socket io必须能够识别调用函数的用户并知道谁必须推送数据)。 希望我已经清楚了:)

req.logout()或req.session.destroy()不起作用

更新: 它的行为与我的实际FBlogin一致。 当我注销我的Facebook,然后单击我的网站上的“login”button,它将我redirect到Facebooklogin页面,并要求我login。 之后,我正确地回到我的网站上的“profile.html”网页。 但是,当我从我的网站点击“注销”时,它会进入我网站的主页。 这一次,当我再次点击“login”button,它直接进入我的网站“profile.html”。 看来最后的“注销”根本不起作用。 “注销”只能在我注销我的Facebook帐户时才起作用。 所以在我的网站上使用的会话依赖于Facebook的会话。 很奇怪! 我正在使用PassportJS来完成我的身份validation作业。 但是我发现req.logout()或者req.session.destroy()根本不起作用。 // route for showing the profile page app.get('/login', isLoggedIn, function(req, res) { res.render('profile', { user : req.user // get the user out of session and pass to template }); }); // route middleware to make sure a user is logged in function isLoggedIn(req, […]

节点js – 用户身份validation,在会话中存储什么?

首先,我没有find任何类似的问题或者有用的材料。 如果我错过了什么,我很抱歉! 其次,我对像node-passport或connect-auth或everyauth这样的现成解决scheme不感兴趣 现在的问题。 我正在使用Redis来存储快速会话。 我的问题是,当用户进行身份validation(即在用户名和密码发布后,这个用户被发现在集合中)我应该在会话中存储什么? 我可以存储整个用户对象(例如,它来自MongoDB的方式)。 我看到的一个缺点是,当用户在数据库中被修改时(他编辑了他的configuration文件),我必须在会话中“重新设置”用户对象。 例如,如果pipe理员更改了用户的configuration文件,则会变得更加复杂 – 在这种情况下,会话不知道用户已被修改,并且数据需要从数据库中刷新,因此会话当前拥有过时的用户对象仅在下次用户login时更新。 创build一个“hash => userid”的集合,并在会话中只存储散列。 然后每一个请求,调用一个中间件,将检查(下面的伪代码,省略检查不存在的哈希,在这种情况下,用户可能会被视为没有login,因为会话过期): 如果(在req.session中的userhash)res.local.user = db.users.findById(db.sessions.findUserIdByHash(req.session.userhash)); 那么这种方法的明显的缺点是额外的收集(即mongodb)或key =>值(即redis)存储散列=> userid也需要一些过程来清理旧的会话哈希(将运行的计划任务\ cron和删除旧的过期的哈希)。 另一个类似于#2的解决scheme,而不是使用三维方collection / key =>值存储,将散列存储为MongoDB中的User对象的一部分。 然而,此方法消除了额外的收集/ redis键值,但仍然需要计划的任务来清除旧的过期会话。 由于过期的会话可能会由“过期date”属性定义,因此它更容易维护活动会话的三方聚合,而不是将会话相关数据放入MongoDB中的User对象(从而使User对象变大)。 我是Node-j的新手,这就是为什么我要问。 我也明白,可能没有正确的答案,或者可能会受到个人喜好的限制。 谢谢!

所有视图中的NodeJS +会话对象,而不是在所有控制器操作上传递它

我希望我的会话可以在所有视图(* .ejs)中使用,而无需在每个操作中传递它。 我的代码如下所示,但req.session对象始终为null,即使在我的“控制器”中,我可以在用户通过身份validation后访问会话对象,方法是指定: req.session.whatever 我的初始化代码(当前在每个请求上执行(我使用debugging断点进行双重检查)是: var appendLocalsToUseInViews = function(req, res, next) { //append request and session to use directly in views and avoid passing around needless stuff res.locals.request = req; if(req.session != null && req.session.user != null) { res.locals.user = req.session.user; } next(null, req, res); }; 我在应用程序设置序言中注册了这个function: app.use(appendLocalsToUseInViews); 我看到人们使用app.use方法和dynamicHelpers。 我使用快递3,似乎他们走了,从快递2弃用…但这似乎并不重要,因为function正在每个请求正确调用。 如何在这种前置控制器代码中访问Express会话? 谢谢! 解决scheme感谢Jani Hartikainen: 我将代码移动到会话中间件加载完成之后, […]

护照和智威汤逊

所以我设法让passport-twitter和jsonwebtoken库一起工作,但为了使它正常工作,我必须使用express-session作为中间件。 我不想添加会话,因为我使用jsonwebtoken来返回令牌。 这里是代码autheticate.js router.get('/twitter', function(req, res, next){ passport.authenticate('twitter', {session: false}, function(err, user, info){ if(err){ return next(err); } if(user){ var token = createToken(user); console.log(token); return res.json({token: token}); } else { return res.status(401).json(info); } })(req, res, next); }); 我已经添加了session:false作为参数,但是在server.js上,它一直在吐出错误,我需要使用express-session。 server.js var express = require('express'); var path = require('path'); var logger = require('morgan'); var bodyParser = require('body-parser'); var […]

续集和快速会话模型

我试图让快速会议与postgres工作。 经过几个小时的debugging,我已经解决了所有的问题,但只有一个。 一切正常,但以下: 如果我在pgAdmin中运行这个查询,我的会话将正常工作 CREATE TABLE "sessions" ( "sid" varchar NOT NULL COLLATE "default", "sess" json NOT NULL, "expire" timestamp(6) NOT NULL ) WITH (OIDS=FALSE); ALTER TABLE "sessions" ADD CONSTRAINT "session_pkey" PRIMARY KEY ("sid") NOT DEFERRABLE INITIALLY IMMEDIATE; 如果我使用sequelize创build模型,那么它不会保存会话。 我敢肯定,这是显而易见,我缺less我的模型定义的一些部分,并会感激任何input。 var Sessions = database.define('sessions', { sid: { type: Sequelize.STRING, primaryKey: true }, expire: { type: […]

有没有一种简单的方法来共享在Rails和Node.js应用程序之间存储在Redis中的会话数据?

我有一个使用Redis作为会话存储的Rails 3.2应用程序。 现在我将在Node.js中编写一部分新function,并希望能够在两个应用程序之间共享会话信息。 我可以手动执行的操作是读取_session_id cookie,然后从名为rack:session:session_id的Redis密钥中读取,但这看起来有点像黑客解决scheme。 有没有更好的方式来共享Node.js和Rails之间的会话?