gpt4 book ai didi

javascript - 如何使用 Passport JS 管理某些使用 Express 的路线的 session ?

转载 作者:行者123 更新时间:2023-12-02 17:22:57 25 4
gpt4 key购买 nike

我使用 express node.js 服务器代码> Passport 。我的整个路由定义取决于使用 mongo-db 的 MongoDB 连接,但 Passport 使用的模型是通过 mongoose 的另一个连接完成的>。我提到这两个细节是因为我认为它也应该以更好的方式编码。

但是,主要问题是,即使 Passport 可以正常工作,我仍然可以直接访问 localhost/registro,无论我是否登录首先。

当有人尝试访问localhost/registro时,如果未先完成登录和身份验证,则应将其重定向到起始页。

我关心它的安全实现,我还想在 session 期间获得一些有关用户的信息。

我很困惑我应该尝试什么,cookie, session 等。除此之外,在新的快速版本中,中间件的工作方式与以前不同。

这是我的server.js:

var express =       require('express')
var mongodb = require('mongodb')
var mongoose = require('mongoose')
var bodyParser = require('body-parser')
var passport = require('passport')
var LocalStrategy = require('passport-local').Strategy;

var app = express()

var BSON = mongodb.BSONPure

app.use(passport.initialize());
app.use(passport.session());

app.use(express.static(__dirname+"/public"))
app.use(bodyParser())

var MongoDBClient = mongodb.MongoClient

mongoose.connect('mongodb://localhost/psicologosTuxtepecDB')

var Schema = mongoose.Schema
var userCredential = new Schema({

username: String,
password: String

}, {
collection: 'members'
})

var userCredentials = mongoose.model('members', userCredential)

passport.serializeUser(function(user, done) {
done(null, user);
})

passport.deserializeUser(function(user, done) {
done(null, user);
})

passport.use(new LocalStrategy(function(username, password, done) {
process.nextTick(function() {
userCredentials.findOne({
'username': username,
}, function(err, user) {
if (err) {
return done(err);
}

if (!user) {
return done(null, false);
}

if (user.password != password) {
return done(null, false);
}

return done(null, user);
});
});
}));

MongoDBClient.connect("mongodb://localhost/psicologosTuxtepecDB", function (error, psicologosTuxtepecDB) {

if (error) {

console.log("We've got a connection error, so far we should take this function better for a correct debug")
}

else {

console.log("Connection to psicologosTuxtepecDB has been successful")

// Seleccionamos una colección
var psicologosCollection = psicologosTuxtepecDB.collection("psicologos")

app.get('/registro', function(request,response) {

response.sendfile("public/html/registro.html")
})

// Cuando nos hagan una petición HTTP de tipo POST en la ruta psicologos...
app.post("/psychos", function(request, response) {

var psychologist = {

personalData: request.body._personalData,
professionalData: request.body._professionalData,
professionalInterests: request.body._professionalInterests
}


psicologosCollection.insert(psychologist, function(error, responseFromDB) {

if (error) {response.send(responseFromDB)}

console.log("Se ha insertado: "+ JSON.strinfigy(responseFromDB))
response.send(responseFromDB)
})
})

app.get("/psychos/:id", function(request, response) {

var id = new BSON.ObjectID(peticion.params.id)

psicologosCollection.findOne(
{'_id':id},
function(error,responseFromDB) { if (error) {response.send(responseFromDB)} response.send(responseFromDB)}
)
})

app.get("/psychos", function(request,response) {

psicologosCollection.find().toArray(function(error,responseFromDB) {
if (error) {response.send(responseFromDB)}
response.send(responseFromDB)
})
})

app.post('/login',
passport.authenticate('local', {
successRedirect: '/loginSuccess',
failureRedirect: '/loginFailure'
})
)

app.get('/loginFailure', function(req, res, next) {
res.redirect('/')
})

app.get('registro', function(request, response) {
response.sendfile('public/html/registro.html')
})

app.get('/loginSuccess', function(req, res, next) {
res.redirect('/registro')

})

app.listen(80, function () {
console.log("app escuchando en el puerto Maricela fecha de nacimiento DDMM")
})
}

})

这些是我的 Passport 声明:

app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser(function(user, done) {
done(null, user);
})

passport.deserializeUser(function(user, done) {
done(null, user);
})

passport.use(new LocalStrategy(function(username, password, done) {
process.nextTick(function() {
userCredentials.findOne({
'username': username,
}, function(err, user) {
if (err) {
return done(err);
}

if (!user) {
return done(null, false);
}

if (user.password != password) {
return done(null, false);
}

return done(null, user);
});
});
}));

最佳答案

表达“链”路线方法。 Express.js 中保护路由的基本思想是有一种方法可以在允许请求继续到预期路由之前检查 a&a。有几种方法可以做到这一点:

方法一:在路由声明中添加auth方法

function requireAuth(req,res,next){
if user is authenticated
next();
else
res.send(401);
}

app.get('/registro', requireAuth, function(request, response) {
response.sendfile('public/html/registro.html')
})

方法 2:为您的身份验证声明一个路由处理程序

app.get('/registro', function(req,res,next){
if user is authenticated
next();
else
res.send(401);
})

app.get('/registro', function(request, response) {
response.sendfile('public/html/registro.html')
})

方法3:使用app.use()代替动词

使用此方法时,您需要考虑 app.router 何时插入中间件。

编辑1:在哪里声明 require auth 方法如果您计划将路由处理程序放置在多个 .js 文件中,那么最好将您的 require auth 方法也放置在单独的 .js 文件中,并在适当的情况下 require 它。

否则,您可以将其与其他所有内容放在同一个文件中。

编辑 2: session 在 Express.js 和 Passport.js 中如何工作

来自Passport.js documentation ,首先需要在passport session 之前配置express session :

app.use(express.session({ secret: 'keyboard cat' }));  
app.use(passport.initialize());
app.use(passport.session());

注意:您可能应该考虑使用内存存储以外的其他方式来进行 session 管理。

与serializeUser和deserializeUser方法一起,此时Passport将在请求上放置一个.user。

您还可以使用 req.isAuthenticated() 来确定用户是否已通过身份验证。

注释 2: 我在使用 SerializeUser 和 deserializeUser 方法与 Passport-Saml 一起使用时遇到了问题。如果是这种情况,只需自行管理 session 即可。

关于javascript - 如何使用 Passport JS 管理某些使用 Express 的路线的 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23751855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com