gpt4 book ai didi

javascript - 在nodejs中使用sequelize和passport登录

转载 作者:行者123 更新时间:2023-12-01 02:11:05 25 4
gpt4 key购买 nike

我正在创建一个具有用户身份验证的自持续聊天应用程序项目。以下代码能够成功注册(添加新用户)。但是,以前注册的用户不会登录。示例:输入用户名 foo 和密码 foopass 后,终端内会发生以下情况

 Executing (default): CREATE TABLE IF NOT EXISTS `users` (`id` INTEGER auto_increment , `email` VARCHAR(255) NOT NULL DEFAULT 'abhinav@gmail.com' UNIQUE, `username` VARCHAR(255) NOT NULL UNIQUE, `password` VARCHAR(255) NOT NULL, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Executing (default): SHOW INDEX FROM `users`
Database is ready
Executing (default): SELECT `id`, `email`, `username`, `password`, `createdAt`, `updatedAt` FROM `users` AS `users` WHERE `users`.`username` = 'foo' LIMIT 1;

以下是我的js文件

1.server.js

const express = require('express')
const session = require('express-session')
const passport = require('passport')
const path = require('path')
const http = require('http')

const app = express()
const server = http.createServer(app)
const cookieparser = require('cookie-parser')
const bodyParser = require('body-parser');
app.set('views',path.join(__dirname , 'chat'));

app.set('view engine','html');
var port = process.env.PORT || 5898;
app.use('/', express.static(path.join(__dirname, 'intro')));
app.use('/profile', express.static(path.join(__dirname, 'chat')));
require('./passport')(passport);
require('./app/routes.js')(app, passport);
app.use(express.json());
app.use(session({
secret: 'project-session',
resave: true,
saveUninitialized:true
}))

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

server.listen(port, () => console.log("Server running on http://localhost:5898"))

这里的介绍是公共(public)文件(每个人都可以访问,即主页),而聊天是私有(private)文件(只有登录用户可以访问)

2.app/routes.js

const express = require('express')
const app = express();
const route = express.Router()
const path = require('path');
const bodyParser = require('body-parser');
const passport = require('passport-local');
const Users = require('../db').Users;
module.exports = function(app,passport)
{

app.use((bodyParser.urlencoded({ extended: false })))
app.use(bodyParser.json());
app.get('/signup', function(req,res) {
res.render('../intro/index');
})
app.get('/login',function(req,res){
res.send({
username: req.body.username
})
})

app.post('/signup', function(req,res){
var a = [req.body.email,req.body.username,req.body.password];
Users.findOne({
where: { email: a[0],
username: a[1],
password: a[2],
}

}).then(users => {
if (users) {
res.send({
url:'/'
})
}
else{
Users.create({
email: a[0],
username: a[1],
password: a[2],

}).then(users => {
res.send({
url:'/profile',
username: a[1]
})
})
}
})


})
app.post('/login', passport.authenticate('local'),
function(req, res) {
res.send({
url:'/profile',
username:req.body.username
});
});

app.get('/logout', function(req, res){
req.logout();
res.redirect('/');
});
}

3.db.js(使用mysql)

const Sequelize = require('sequelize');

const db = new Sequelize(
'socializedb',
'soc',
'socpass',

{
dialect: 'mysql',
host: 'localhost',
operatorsAliases: false,
}
);

const Users = db.define('users', {
id: {
type: Sequelize.INTEGER,
autoIncrement: true,
primaryKey: true,
},
email: {
type: Sequelize.STRING,
allowNull: false,
unique: true,
defaultValue: "abhinav@gmail.com"
},
username: {
type: Sequelize.STRING,
allowNull: false,
unique: true,
},
password: {
type: Sequelize.STRING,
allowNull: false,
}

})


db.sync().then(() => console.log("Database is ready"))

exports = module.exports = {
db,
Users
}

4.passport.js(我的本地策略所在的位置)

const LocalStrategy = require('passport-local').Strategy
const Users = require('./db').Users
module.exports = function(passport)
{
console.log("passport is working");
passport.serializeUser(function (users, done) {
return done(null, users.id);
console.log("Serialize");

})

passport.deserializeUser(function (id, done) {
console.log("DeSerialize");
Users.findById(id).then((users) => {
console.log(users);
return done(null, users);
});
})

passport.use(new LocalStrategy(
function(username, password, done) {
Users.findOne({where:{ username: username} },
function(err, users) {
if (err) { return done(err); }
if (!users) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!users.password === password) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, users);
});
}
));

}

我使用了本地身份验证。我确信这不是我的数据库的问题,因为我可以看到驻留在我的计算机上的表内的条目。我主要认为问题可能是在 Passport 中使用序列化/反序列化。提前致谢。

最佳答案

该代码存在两个与登录相关的问题。

1. Sequelize 查询与 Promise 一起使用。 Passport 的本地策略回调中的 Sequelize Query 尝试使用回调而不是 Promise。所以,

passport.use(new LocalStrategy(
function(username, password, done) {
Users.findOne({where:{ username: username} },
function(err, users) {
if (err) { return done(err); }
if (!users) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!users.password === password) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, users);
});
}
));

必须更改为

passport.use(new LocalStrategy(
function (username, password, done) {
Users.findOne({ where: { username: username } })
.then(function (users) {
if (!users) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!users.password === password) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, users);
})
.catch(err => done(err));
}
));

这有望解决当前的错误。

<小时/>2. 另一个问题是在server.js中,必须在Passport初始化之后调用路由器函数来初始化Passport,然后才能实际尝试使用它们。否则,登录和其他路由将在 Passport 初始化中间件之前尝试使用 Passport ,从而导致错误。所以,

require('./app/routes.js')(app, passport);

必须在之后移动

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

<小时/>这两个修复应该启用用户登录。

关于javascript - 在nodejs中使用sequelize和passport登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49771925/

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