小编lag*_*lex的帖子

为什么connect-mongo会为每个请求创建新会话?

我有两个nodejs服务器(web-server,socket-server),它们通过socket.io相互连接.在Web服务上,我使用express.js和passport.js作为身份验证中间件.

这是我的网络服务器配置:

var express = require('express'),
    mongo = require('mongodb'),
    io = require('socket.io'),
    passport = require('passport'),
    LocalStrategy = require('passport-local').Strategy,
    MongoStore = require('connect-mongo')(express);

app.configure(function () {
    app.use(express.cookieParser());
    app.use(express.methodOverride());
    app.use(express.bodyParser());
    app.use(express.session({
        secret: 'keyboard cat',
        store: new MongoStore({
          db: 'MyDatabase'
        })
    }));
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(app.router);
    app.use(express.static(__dirname + '/htdocs'));
});
Run Code Online (Sandbox Code Playgroud)

当我使用connect-mongo时,它会为每个http请求创建一个新会话.

此元素使用登录请求创建:

{
  "_id" : "UCnXade6Bk6ofOZ+jiEgzyH8",
  "session" : "{\"cookie\":{\"originalMaxAge\":31536000000,\"expires\":\"2014-03-07T13:07:45.703Z\",\"httpOnly\":true,\"path\":\"/\"},\"passport\":{\"user\":\"50cae08806e31ea2e5634e3f\"}}",
  "expires" : new Date("7.3.2014 19:07:45")
}
Run Code Online (Sandbox Code Playgroud)

每当我按F5或接受套接字时,此元素就会创建.

{
  "_id" : "JhypbYFtj1CGOK/ylMhG8+Yk",
  "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"passport\":{}}",
  "expires" : new Date("21.3.2013 19:03:38")
}
Run Code Online (Sandbox Code Playgroud)

当web-server采用套接字连接时,connect-mongo会创建新会话.每分钟大约有50个新文档.

可能是什么原因?

UPDATE

在更新页面的情况下,帮助提示添加app.use(express.favicon()). …

authentication mongodb node.js express passport.js

8
推荐指数
1
解决办法
2448
查看次数

阻止访问AngularJS中的管理页面

我想知道AngularJS中最好的方法是保护管理页面,即普通用户不应该看到的页面.显然,会有后端身份验证,但由于AngularJS应用程序是客户端,人们理论上仍然可以查看路由并直接转到这些URL并查看管理页面.

我使用Express,PassportJS和MongoDB(Mongoose)作为我的后端.当然,他们无法与管理页面进行交互,因为在创建,删除时都有服务器端身份验证......但我更倾向于甚至不向用户提供页面,如果他们没有适当的访问.由于该应用程序完全是客户端JS,我认为这是不可能的,因为人们可以只修改路由和诸如此类的东西.最好的方法是什么?感谢您的任何意见!

security node.js express angularjs passport.js

8
推荐指数
1
解决办法
6112
查看次数

如何使用PassportJS保护API端点?

我的应用程序使用Express和AngularJS.我正在使用express通过静态来处理角度代码的基本网络搜索.角度代码使用命中由express托管的API端点的服务.我只希望在用户通过身份验证后可以访问API端点.我怎样才能通过PassportJS实现这一目标?

express angularjs passport.js

8
推荐指数
1
解决办法
7067
查看次数

当请求包含授权标头时,阻止Expressjs创建会话?

我有一个API,可以使用浏览器调用,其中请求是事务性的,并且直接具有会话OR,例如.使用curl,其中请求是原子的.浏览器请求必须首先进行身份验证,然后使用快速会话(connect.sid)进行后续授权,直接API调用使用标头:Authorization: "SOMETOKEN"必须为每个请求发送标头.

我遇到的问题是,因为我使用相同的Web服务器来提供原子和事务流量,所以每次API调用都会被Express发送给会话.每个响应都包含一个Set-Cookie,所有这些会话都填满了我的会话存储.因此:当请求包含Authorization标头时,如何阻止Express在内存存储区(Redis)中输入新的sess密钥?

注意.我得到一个更经典的方法是拥有一个单独的API服务器和一个单独的WEB服务器,但为什么不在一台机器上运行?对我来说,不同之处在于API提供数据,WEB提供视图,但除此之外,它们都是同一个应用程序的一部分.我恰好也允许用户直接访问他们的数据,不要强迫他们使用我的界面.

快速配置

module.exports = function(app, exp, sessionStore, cookieParser, passport, flash) {

    app.configure(function(){
        // Templates
        app.set('views', ERNEST.root + '/server/views');
        app.set('view engine', 'jade');
        app.set('view options', { doctype : 'html', pretty : true });

        // Allow large files to be uploaded (default limit is 100mb)
        app.use(exp.limit('1000mb'));

        // Faux putting and deleting
        app.use(exp.methodOverride());

        // Static content
        app.use(exp.static(ERNEST.root + '/server'));
        app.use(exp.static(ERNEST.root + '/public'));

        // Handle favicon
        app.use(exp.favicon());

        // For uploads
        app.use(exp.bodyParser({keepExtensions: true}));

        // Configure cookie parsing
        if ( cookieParser …
Run Code Online (Sandbox Code Playgroud)

connect node.js express passport.js

8
推荐指数
1
解决办法
4253
查看次数

如何强制刷新req.user?

我在我的node.js/express应用程序中使用带有本地身份验证策略的passport.js.

返回的用户LocalStrategy包括电子邮件和用户名等内容.

我想让用户能够在应用程序中更新他们的电子邮件或用户名.当发生这种情况时,我想告诉护照重新加载用户(类似于他们刚刚登录),以便req.user反映会话剩余部分的更新更改.简单地设置它似乎不会超过那个请求.

简化示例:

app.get('/changeEmail', function(req, res, next) {

    var userId = req.user.id;
    var origEmail = req.user.email;
    var newEmail = req.param('email');

    userDao.updateEmail(userId, newEmail, function(err) {
        if (!err) {
            // user's email has changed, need change reflected in req.user from this point on
            req.user.email = newEmail;
        }
        next();
    });

});
Run Code Online (Sandbox Code Playgroud)

session node.js express passport.js

8
推荐指数
1
解决办法
2089
查看次数

req.session.passport和req.user空白,并且req.isAuthenticated在使用passport-facebook初次成功登录后返回false

在初次成功登录Facebook并使用passport-facebook 1.0.3和express 4.6.1登录重定向回调后,req.session.passport和req.user包含序列化调用期间设置的值(我从stragegy获得),但是在随后访问网站上的不同路由时,req.session.passport和req.user为空,req.isAuthenticated()返回false,因此在从FB初始成功登录后,所有其他路由上的ensureAuthentication方法都会失败.我没有使用群集设置,所以我相信内存存储足以处理这个,快速配置看起来很好(我的意思是顺序),这是我的快速配置

configExpressApp.set('views',  './views');
configExpressApp.set('view engine', 'jade');
configExpressApp.use(morgan('dev'));
configExpressApp.use(cookieParser());
configExpressApp.use(bodyParser.urlencoded({
  extended: true,
}));
configExpressApp.use(bodyParser.json());
configExpressApp.use(expressSession({
  secret:'MyExpressSecret', 
  saveUninitialized: true,
  resave: true
}));
configExpressApp.use(passport.initialize());
configExpressApp.use(passport.session());
configExpressApp.use(methodOverride());
configExpressApp.use(express.static('./public'));   
Run Code Online (Sandbox Code Playgroud)

这是初始成功登录和重定向的req.session对象,req.user包含与req.session.passport.user相同的数据.

{ cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true },
  passport: 
   { user: 
      { _id: 53ce23e3121421f229a438f8,
        info: false,
        loginType: 'fb',
        fbId: 'MyId',
        name: 'Karthic Rao',
        email: 'kartronics85@yahoo.com'

        }
     }
} 
Run Code Online (Sandbox Code Playgroud)

这是我之前与策略内部的done()回调以及序列化调用内部关联的信息.在成功登录和回调之后,我使用res.redirect将用户重定向到不同的路由,但来自该路由的请求包含sessionID(所以我不认为它与会话存储的问题),但是req.user字段不存在(可能是因为passport.initialize()和passport.session()中间件没有找到要进行身份验证的请求)并且req.session.passport字段为空,这里是来自req的console.log的详细信息对象.

sessionID: 'I9R1c3PIYgDW5OpWbNT7qb02Hn4lOeAB',
session: 
   { cookie: 
      { path: '/',
        _expires: null,
        originalMaxAge: null,
        httpOnly: true },
     passport: {} },
Run Code Online (Sandbox Code Playgroud)

这是我的反序列化方法

passport.deserializeUser(function(user, …
Run Code Online (Sandbox Code Playgroud)

authentication node.js express passport-facebook passport.js

8
推荐指数
1
解决办法
7294
查看次数

在node.js中,为什么护照会话因触发"文件"事件而无法停止?

在我的应用程序中,我只使用

app.use(express.json());
app.use(express.urlencoded());
Run Code Online (Sandbox Code Playgroud)

并不是

app.use(express.bodyParser());
Run Code Online (Sandbox Code Playgroud)

这样我就可以手动解析文件上传.看来这一行

app.use(passport.session());
Run Code Online (Sandbox Code Playgroud)

停止强制触发文件事件:

form.on('file', function(name, file) {
  //never called
});
Run Code Online (Sandbox Code Playgroud)

如何使用护照会话而不与强大的文件事件发生冲突?

node.js formidable passport.js

7
推荐指数
1
解决办法
696
查看次数

node.js REST api身份验证和oauth2

我有几个问题:

1)对于外部API使用和作为主干(或普通js)前端的服务器端,使用REST API是一个好习惯吗?我认为编写一个REST API服务器并将其用作后端要容易得多.

2)如果我使用oauth 2标准编写我的webapp身份验证,这是将我的秘密令牌存储在cookie中的好方法吗?我认为这会导致CSRF漏洞.

正如我所看到的,passport.js使用cookie存储秘密令牌,例如Facebook或Twitter ......在这种情况下,CSRF是什么?

rest csrf node.js passport.js

7
推荐指数
1
解决办法
2676
查看次数

从passportjs中的刷新令牌获取oauth访问令牌

要确定何时使用刷新令牌来请求新的访问令牌,我知道两种方法(下面).如果不修改passport-google-oauth库,这些方法中的任何一种都可以吗?

1)"先发制人"方法

  • 在授予访问令牌时,保存访问令牌的到期时间
  • 每当使用访问令牌访问API时,请检查当前时间的到期时间
  • 如果访问令牌未过期,请使用它来访问API
  • 如果访问令牌已过期(或接近过期),请提供刷新令牌以获取新的访问令牌

2)"手柄故障"方法

  • 始终提供访问令牌
  • 如果访问令牌无法进行身份验证,请提供刷新令牌,获取新的访问令牌

谢谢.也欢迎任何替代品.

oauth google-api node.js google-oauth passport.js

7
推荐指数
2
解决办法
7310
查看次数

使用Passport进行身份验证后创建新会话

我用护照创建了一个简单的身份验证应用程序(参见下面的代码).通过会话中间件快速,在请求客户端尚未拥有会话的每个请求上创建会话.我想在登录后分配会话,或者在登录后创建新会话.

这是因为我最终将通过HTTPS进行登录,并希望防止黑客劫持已经过身份验证的用户的会话.

这是我的服务器代码:

// Server.js configures the application and sets up the webserver

//importing our modules
var express = require('express');
var app = express();
var port = process.env.PORT || 8080;
var mongoose = require('mongoose');
var passport = require('passport');
var flash = require('connect-flash');
var MongoStore = require('connect-mongo')(express);

var configDB = require('./config/database.js');

//Configuration of Databse and App

mongoose.connect(configDB.url); //connect to our database

require('./config/passport')(passport); //pass passport for configuration

app.configure(function() {

    //set up our express application

    app.use(express.logger('dev')); //log every request to the console
    app.use(express.cookieParser()); …
Run Code Online (Sandbox Code Playgroud)

authentication session node.js passport.js

7
推荐指数
2
解决办法
6316
查看次数