用户那里获取值?"/>
passport.authenticate(...) 如何从用户那里获取值?
顶层代码
require('dotenv').config()
const express= require("express")
const ejs=require("ejs")
const bodyParser=require("body-parser")
const mongoose =require("mongoose")
const session=require("express-session")
const passport=require("passport")
const passportLocalMongoose=require("passport-local-mongoose")
const app= express()
const saltRounds = 10;
const PORT=3000||process.env.PORT
app.use(bodyParser.urlencoded({extended:true}))
app.use(express.static("public"))
app.set('view engine',"ejs")
app.use(session({
secret:"My secret",
resave:false,
saveUninitialized:false,
}))
app.use(passport.initialize())
app.use(passport.session())
const uri='mongodb://127.0.0.1:27017/userDB'
const MongoConnect=async()=>{
try {
await mongoose.connect(uri);
console.log("Connected Succesfully")
}
catch (error) {
console.log(error);
}
}
const userSchema= new mongoose.Schema({
email:String,
password:String
})
userSchema.plugin(passportLocalMongoose)
const user= new mongoose.model("user",userSchema)
passport.use(user.createStrategy());
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(user, done) {
done(null, user);
});
app.route("/")
.get((req,res)=>{
res.render("home")
})
app.route("/login")
.get((req,res)=>{
res.render("login")
})
//-----------------------------THE "PROBLEM"--------------------
.post((req,res)=>{
passport.authenticate("local",{ failureRedirect: '/login', failureMessage: true })(req,res,function () {
res.redirect("/secrets")
})
})
//-------------------------------------------------
app.route("/register")
.get((req,res)=>{
res.render("register")
})
.post((req,res)=>
{
user.register({username:req.body.username},req.body.password,(err,user) =>{
if(err)
{
console.log(err)
res.redirect("/register")
}
else{
passport.authenticate("local")(req,res,function () {
res.redirect("/secrets")
})
}
})
})
app.get("/secrets",function (req,res) {
console.log(req.isAuthenticated())
if(req.isAuthenticated()){
res.render("secrets")
}
else{
res.redirect("/login")
}
})
app.get('/logout', function(req, res, next){
req.logout(function(err) {
if (err) { return next(err); }
res.redirect('/');
});
});
MongoConnect(). then(()=>{
app.listen(PORT,()=>
{
console.log("Server is Running on port 3000")
})
})
.catch((err)=>{
console.log(err)
})
Faulty code
所以我有这段代码,但我不知道 passport.authenticate 如何获取用户的输入。没有body parser,在没有bodyparser的情况下,它如何在数据库中进行比较。
在我尝试上面的代码之前,我实现了下面的代码(req.login),它给了我一些问题,即使我写错了密码,我仍然能够通过路由 localhost:3000/secrets ,所以我更改了它并添加了 passport.authenticate(..) 函数并解决了问题,但我根本不明白为什么它会起作用。 passport.authenticate(..) 如何在没有 body-parser 的情况下获取用户的输入。
.post((req,res)=>{
const user1 =new user({
username:req.body.usermame,
password:req.body.password
})
req.login(user1,function (err) {
if(err)
console.log(err)
else{
passport.authenticate("local",{ failureRedirect: '/login', failureMessage: true })(req,res,function () {
res.redirect("/secrets")
})
}
})
})
回答如下:
你使用
作为passport-local-mongoose
策略loxal
使用passport-local-mongoose
passport-local
检查passport-local
和req.body.username
:req.body.password
源码:
var username = lookup(req.body, this._usernameField) || lookup(req.query, this._usernameField);
var password = lookup(req.body, this._passwordField) || lookup(req.query, this._passwordField);
更多推荐
passport.authenticate(...) 如何从用户那里获取值?
发布评论