我有两个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()). …
我想知道AngularJS中最好的方法是保护管理页面,即普通用户不应该看到的页面.显然,会有后端身份验证,但由于AngularJS应用程序是客户端,人们理论上仍然可以查看路由并直接转到这些URL并查看管理页面.
我使用Express,PassportJS和MongoDB(Mongoose)作为我的后端.当然,他们无法与管理页面进行交互,因为在创建,删除时都有服务器端身份验证......但我更倾向于甚至不向用户提供页面,如果他们没有适当的访问.由于该应用程序完全是客户端JS,我认为这是不可能的,因为人们可以只修改路由和诸如此类的东西.最好的方法是什么?感谢您的任何意见!
我的应用程序使用Express和AngularJS.我正在使用express通过静态来处理角度代码的基本网络搜索.角度代码使用命中由express托管的API端点的服务.我只希望在用户通过身份验证后可以访问API端点.我怎样才能通过PassportJS实现这一目标?
我有一个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) 我在我的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) 在初次成功登录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
在我的应用程序中,我只使用
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)
如何使用护照会话而不与强大的文件事件发生冲突?
我有几个问题:
1)对于外部API使用和作为主干(或普通js)前端的服务器端,使用REST API是一个好习惯吗?我认为编写一个REST API服务器并将其用作后端要容易得多.
2)如果我使用oauth 2标准编写我的webapp身份验证,这是将我的秘密令牌存储在cookie中的好方法吗?我认为这会导致CSRF漏洞.
正如我所看到的,passport.js使用cookie存储秘密令牌,例如Facebook或Twitter ......在这种情况下,CSRF是什么?
要确定何时使用刷新令牌来请求新的访问令牌,我知道两种方法(下面).如果不修改passport-google-oauth库,这些方法中的任何一种都可以吗?
1)"先发制人"方法
2)"手柄故障"方法
谢谢.也欢迎任何替代品.
我用护照创建了一个简单的身份验证应用程序(参见下面的代码).通过会话中间件快速,在请求客户端尚未拥有会话的每个请求上创建会话.我想在登录后分配会话,或者在登录后创建新会话.
这是因为我最终将通过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) passport.js ×10
node.js ×9
express ×6
angularjs ×2
session ×2
connect ×1
csrf ×1
formidable ×1
google-api ×1
google-oauth ×1
mongodb ×1
oauth ×1
rest ×1
security ×1