#node.js #passport.js #passport-local
#node.js #passport.js #паспорт-локальный
Вопрос:
У меня есть приложение nodejs, использующее passport для аутентификации.
В настоящее время у меня возникла проблема с моей регистрацией / входом в систему (я просто покажу проблему с регистрацией, поскольку у этих двоих одна и та же проблема). Когда я попытался отправить сообщение с помощью «email», «password», «fullname», в консоли регистрируется, что
info { message: 'Missing credentials' }
Код, который запускает это сообщение, находится в auth.js ниже.
Не мог бы кто-нибудь, пожалуйста, предложить способ решить эту проблему? Кроме того, побочный вопрос: как я могу получить идентификатор текущего пользователя в сеансе? Должен ли это быть req.user или req.session.passport.user
Вот моя структура приложения
├── config
│ ├── config.json
│ └── passport.js
├── models
│ ├── index.js
│ └── user.js
├── query.js
├── routes
│ ├── auth.js
└── server.js
server.js
const express = require("express");
const bodyParser = require("body-parser");
const cors = require('cors');
const passport = require('passport');
const flash = require('connect-flash');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const app = express();
const port = process.env.port || 8080;
app.use(cors());
app.use(express.json());
app.use(bodyParser.urlencoded( {extended: false} ));
app.use(bodyParser.json());// pass the body as json
app.use(session({
secret: 'goN6DJJC6E287cC77kkdYuNuAyWnz7Q3iZj8',
resave: false,
saveUninitialized: false,
cookie: {
expires: 600000
}
}));
// PASSPORT: for passport authentication
require('./config/passport')(passport);
app.use(passport.initialize());
app.use(passport.session()); // persistent login sessions
// FLASH: for error messages
app.use(flash());
// ROUTES:
require('./routes/auth')(app, passport);
app.listen(port, () => {
console.log(`Server is running on port ${port}`)
});
passport.js (красивый исходный код из https://github.com/b0bbybaldi/Rent-All/blob/master/config/passport.js ). Спасибо b0bbybaldi :)))))
var LocalStrategy = require('passport-local').Strategy;
var db = require('../models');
module.exports = function(passport) {
// SERIALIZE
passport.serializeUser(function(user, done) {
done(null, user.id);
});
// deserialize
passport.deserializeUser(function(id, done) {
db.User.findById(id).then(function(user) {
if (user) {
done(null, user.get());
} else {
done(user.errors, null);
}
});
});
passport.use('local-signup', new LocalStrategy(
{
// by default, local strategy uses username and password, we will override with email
usernameField: 'email',
passwordField : 'password',
passReqToCallback : true // allows us to pass back the entire request to the callback
},
function(req, email, password, done) {
process.nextTick(function() {
db.User.findOne({
where: {
email: req.body.email
}
}).then(function(user, err){
if(err) {
console.log("err",err)
return done(err);
}
// check to see if theres already a user with that email
if (user) {
console.log('signupMessage', 'That email is already taken.');
return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
} else {
// console.log("creating");
db.User.create({
email: req.body.email,
fullname:req.body.fullname,
password: db.User.generateHash(req.body.password)
}).then(function(dbUser) {
//console.log("created result: ", dbUser);
// send post back to render
console.log("User Created")
return done(null, dbUser);
}).catch(function (err) {
// handle error;
console.log(err);
});
}
});
});
}));
}
auth.js
var db = require("../models");
module.exports = function (app, passport) {
app.post('/signup', function(req, res, next) {
passport.authenticate('local-signup', function(err, user, info) {
console.log("info", info);
if (err) {
console.log("passport err", err);
return next(err); // will generate a 500 error
}
// Generate a JSON response reflecting authentication status
if (! user) {
console.log("user error", user);
return res.send({ success : false, message : 'authentication failed' });
}
req.login(user, loginErr => {
if (loginErr) {
console.log("loginerr", loginErr)
return next(loginErr);
}
//var userId = user.dataValues.id;
console.log('redirecting....');
res.cookie('user_id', user.id);
res.cookie('user_name', user.fullname );
//return res.json("/accounts/view");
console.log("Registered")
});
})(req, res, next);
});
}
Комментарии:
1. Я не гуру или эксперт в области js, узлов или узлов, но разве вам не нужны расширения файлов в ваших заявлениях require? или это все еще нормально загружает ресурсы? просто спрашиваю из любопытства…
2. также почему db.User.findOne использует Capitol, но везде он строчный?
3. @RyanStone Привет, Райан, о расширениях файлов, не могли бы вы подробнее рассказать? Я думаю, что код между файлами может взаимодействовать должным образом. Для db.User.findOne и «user» давайте подумаем так: в моей папке models, которую я импортировал как db в данном случае, был экспортированный модуль с именем User; я использовал findOne в качестве метода этого модуля. «Пользователь», заключенный в функцию then, был просто переменной, которая извлекала результат из функции findOne. Это имеет смысл для вас?
4. Конечно… Я знаю, что когда вам требуются встроенные модули узла, им не требуется расширение или абсолютный путь, но в вашей части, где говорится: «var db = require («.. / models»)» Не уверен, было ли это целенаправленно моделями или модулями, но если этофайл, который вы создали, я думаю, ему нужен полный путь
models.js, models.php, models.html, models.jsx
, т. Е. И т.д…. Если он не выдает ошибку, то это может быть не проблема, я просто просматривал ваш код, пытаясь лучше его понять..5. Привет, Райан, извините за мой поздний ответ. в данном случае «модели» — это папка, содержащая модули внутри. Однако, даже если это модули, я все равно могу ссылаться на него без .js tail