admin管理员组文章数量:1326315
I have used Express on top of Node with .hbs templating. I am using passport to validate the particular user. The database I have used in MongoDB.
Here's my sign-up route:
var express = require('express');
var router = express.Router();
var passport = require('passport');
var userServices = require('../services/user-services');
router.get('/', function(req, res, next) {
var vm = {
title: 'Join this web',
};
res.render('signup', vm);
});
router.post('/', function(req, res, next) {
userServices.addUser(req.body, function(err){
if(err){
var vm = {
title: 'Create an account',
input: req.body,
error: err
};
delete vm.input.password;
return res.render('signup', vm);
}
req.login(req.body, function(err) {
res.redirect('/profile');
});
});
});
router.post('/login', passport.authenticate('local'), function(req, res, next){
res.redirect('/profile');
});
module.exports = router;
Here is my login route:
var express = require('express');
var router = express.Router();
router.get('/', function(req, res, next) {
if (req.user) {
return res.redirect('/profile');
}
res.render('login', { title: 'Login' });
});
module.exports = router;
I have defined the configuration of of my passport in my passport-congig file:
module.exports=function(){
var passport = require('passport');
var passportLocal = require('passport-local');
var userServices = require('../services/user-services');
passport.use(new passportLocal.Strategy({usernameField: 'email'}, function(email, password, next) {
userServices.findUser(email, function(err, user){
if(err){
return next(err);
}
if(!user||user.password!==password){
return next(null, null);
}
next(null, user);
});
}));
passport.serializeUser(function(user, next){
next(null, user.email);
});
passport.deserializeUser(function(user, next){
userServices.findUser(email, function(err, user){
next(err, user);
});
});
};
Also, here is my app.js with passport related code:
var passportConfig = require('./auth/passport-config');
passportConfig();
var app = express();
app.use(expressSession({
secret:'trawel man',
saveUninitialized: false,
resave: false
}));
app.use(passport.initialize());
app.use(passport.session());
Here is the stack trace of the error that I'm receiving:
Error: Not Found
at C:\Users\James\MEAN\app.js:56:15
at Layer.handle [as handle_request] (C:\Users\James\MEAN\node_modules\express\lib\router\layer.js:82:5)
at trim_prefix (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:302:13)
at C:\Users\James\MEAN\node_modules\express\lib\router\index.js:270:7
at Function.proto.process_params (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:321:12)
at next (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:261:10)
at C:\Users\James\MEAN\node_modules\express\lib\router\index.js:603:15
at next (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:246:14)
at Function.proto.handle (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:166:3)
at router (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:35:12)
at Layer.handle [as handle_request] (C:\Users\James\MEAN\node_modules\express\lib\router\layer.js:82:5)
at trim_prefix (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:302:13)
at C:\Users\James\MEAN\node_modules\express\lib\router\index.js:270:7
at Function.proto.process_params (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:321:12)
at next (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:261:10)
at C:\Users\James\MEAN\node_modules\express\lib\router\index.js:603:15
This is what I got at my server console:
POST /login 404 32.453 ms - 2847
I have no idea why this isn't working. I am new to Node. Someone help me out.
I have used Express on top of Node with .hbs templating. I am using passport to validate the particular user. The database I have used in MongoDB.
Here's my sign-up route:
var express = require('express');
var router = express.Router();
var passport = require('passport');
var userServices = require('../services/user-services');
router.get('/', function(req, res, next) {
var vm = {
title: 'Join this web',
};
res.render('signup', vm);
});
router.post('/', function(req, res, next) {
userServices.addUser(req.body, function(err){
if(err){
var vm = {
title: 'Create an account',
input: req.body,
error: err
};
delete vm.input.password;
return res.render('signup', vm);
}
req.login(req.body, function(err) {
res.redirect('/profile');
});
});
});
router.post('/login', passport.authenticate('local'), function(req, res, next){
res.redirect('/profile');
});
module.exports = router;
Here is my login route:
var express = require('express');
var router = express.Router();
router.get('/', function(req, res, next) {
if (req.user) {
return res.redirect('/profile');
}
res.render('login', { title: 'Login' });
});
module.exports = router;
I have defined the configuration of of my passport in my passport-congig file:
module.exports=function(){
var passport = require('passport');
var passportLocal = require('passport-local');
var userServices = require('../services/user-services');
passport.use(new passportLocal.Strategy({usernameField: 'email'}, function(email, password, next) {
userServices.findUser(email, function(err, user){
if(err){
return next(err);
}
if(!user||user.password!==password){
return next(null, null);
}
next(null, user);
});
}));
passport.serializeUser(function(user, next){
next(null, user.email);
});
passport.deserializeUser(function(user, next){
userServices.findUser(email, function(err, user){
next(err, user);
});
});
};
Also, here is my app.js with passport related code:
var passportConfig = require('./auth/passport-config');
passportConfig();
var app = express();
app.use(expressSession({
secret:'trawel man',
saveUninitialized: false,
resave: false
}));
app.use(passport.initialize());
app.use(passport.session());
Here is the stack trace of the error that I'm receiving:
Error: Not Found
at C:\Users\James\MEAN\app.js:56:15
at Layer.handle [as handle_request] (C:\Users\James\MEAN\node_modules\express\lib\router\layer.js:82:5)
at trim_prefix (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:302:13)
at C:\Users\James\MEAN\node_modules\express\lib\router\index.js:270:7
at Function.proto.process_params (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:321:12)
at next (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:261:10)
at C:\Users\James\MEAN\node_modules\express\lib\router\index.js:603:15
at next (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:246:14)
at Function.proto.handle (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:166:3)
at router (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:35:12)
at Layer.handle [as handle_request] (C:\Users\James\MEAN\node_modules\express\lib\router\layer.js:82:5)
at trim_prefix (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:302:13)
at C:\Users\James\MEAN\node_modules\express\lib\router\index.js:270:7
at Function.proto.process_params (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:321:12)
at next (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:261:10)
at C:\Users\James\MEAN\node_modules\express\lib\router\index.js:603:15
This is what I got at my server console:
POST /login 404 32.453 ms - 2847
I have no idea why this isn't working. I am new to Node. Someone help me out.
Share Improve this question edited Dec 21, 2015 at 12:05 asked Dec 13, 2015 at 12:39 user5499130user5499130 16-
3
Your
deserializeUser
is referencing an undefined variable (email
). Your strategy handler is not callingnext()
when the user is valid. You're using a variablepass
which is undefined. It's also unclear how you are connecting Express with Passport. Perhaps you should start with thepassport-local
example if you're new to all of this. – robertklep Commented Dec 13, 2015 at 13:07 - Thank you for pointing out those errors. I have updated it with the new code. But it still doesn't work. – user5499130 Commented Dec 13, 2015 at 13:21
- I have added the code where I try to connect passport to express, Robert. – user5499130 Commented Dec 13, 2015 at 13:28
- Is not working means that you get an error, it doesn't log you in, login fails...? – rodrigoap Commented Dec 13, 2015 at 13:32
- 1 That error looks like you have a missing route. Perhaps /profile ? – Gary Commented Dec 13, 2015 at 16:13
3 Answers
Reset to default 4 +25// process the login form
router.post('/login', passport.authenticate('local-login', {
successRedirect: '/', // redirect to the home page
failureRedirect: '/login', // redirect back to the login page if there is an error
failureFlash: true // allow flash messages
}));
This is passport code you should use: (you need to add your user schema path)
// load all the things we need
var LocalStrategy = require('passport-local').Strategy;
// load up the user model
var User = require('....'); //enter here user path schema
// load the auth variables
module.exports = function(passport) {
// =========================================================================
// passport session setup ==================================================
// =========================================================================
// required for persistent login sessions
// passport needs ability to serialize and unserialize users out of session
// used to serialize the user for the session
passport.serializeUser(function(user, done) {
done(null, user.id);
});
// used to deserialize the user
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
// =========================================================================
// LOCAL LOGIN =============================================================
// =========================================================================
passport.use('local-login', 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 in the req from our route (lets us check if a user is logged in or not)
},
function (req, email, password, done) {
if (email)
email = email.toLowerCase(); // Use lower-case e-mails to avoid case-sensitive e-mail matching
// asynchronous
process.nextTick(function() {
User.findOne({ 'local.email' : email }, function (err, user) {
console.log(user);
// if there are any errors, return the error
if (err)
return done(err);
// if no user is found, return the message
if (!user)
return done(null, false, req.flash('loginMessage', 'No user found.'));
if (!user.validPassword(password))
return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.'));
// all is well, return user
else
return done(null, user);
});
});
}));
};
EDIT:
I added to you an example to User
Schema in mongoDB so it will be for you easier to change your code:
// load the things we need
var mongoose = require('mongoose');
var bcrypt = require('bcrypt-nodejs');
var userSchema = mongoose.Schema({
local : {
email : String,
password : String
}
});
// generating a hash
userSchema.methods.generateHash = function(password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};
// checking if password is valid
userSchema.methods.validPassword = function(password) {
return bcrypt.pareSync(password, this.local.password);
};
// create the model for users and expose it to our app
module.exports = mongoose.model('User', userSchema);
//module.exports = userSchema;
module.exports.schema = userSchema;
You're missing a route for /profile
that's why your final "Not Found" route is being called.
Add a route with
router.get('/profile', function (req, res, next) {
var vm = { name : req.user ? req.user.name:null };
res.render('profile', vm);
})
and that error won't be thrown
EDIT:
Seems like you're getting the error when trying to login, not after. That's because your route for POST login
is in the wrong file. In your login route file, add the following:
router.post('/', passport.authenticate('local'), function(req, res, next){
res.redirect('/profile');
});
(Make sure to import the dependencies)
And remove that router.post('/login'...
from the signup route.
import User from "../models/User";
import Role from "../models/Role";
import jwt from "jsonwebtoken";
import config from "../config";
//const timer1 = (ms) => new Promise((res) => setTimeout(res, ms));
export const signUp = async (req, res) => {
try {
// Getting the Request Body
const {
username,
email,
password,
roles,
nombres,
apellidos,
status,
telefono,
cedula,
foto,
typo,
} = req.body;
// Creating a new User Object
const newUser = new User({
username,
email,
nombres,
apellidos,
status,
telefono,
foto,
cedula,
typo,
password: await User.encryptPassword(password),
});
// checking for roles
if (req.body.role) {
newUser.roles = req.body.role;
} else {
const role = await Role.findOne({
name: "Docente"
});
newUser.roles = [role._id];
}
// Saving the User Object in Mongodb
newUser.roles = req.body.role;
const savedUser = await newUser.save();
return res.status(200).json({
savedUser
});
} catch (error) {
console.log(error);
return res.status(500).json(error);
}
};
//---------------------------------------------------------LOGIN ACCESS--------------------------
export const signin = async (req, res) => {
try {
// EL CUERPO DE CORREO O EL CUERPO DE USERNAME
const userFound = await User.findOne({
email: req.body.email
}).populate(
"roles"
);
//VERIFICAR sI EL USUARIO EXISTE EN BASE DE DATOS
if (!userFound) return res.status(400).json({
message: "User Not Found 1"
});
//SI EXISTE PASA A VERIFICAR Y DESENCRIPTAR LA CONTRASEÑA
const matchPassword = await User.parePassword(
req.body.password,
userFound.password
);
//RETORNA EL RESULATDO
if (!matchPassword)
return res.status(401).json({
token: null,
message: "Invalid Password",
});
//OPTENERMOS EL ROL
var toles = null
const roles = await Role.find({
_id: {
$in: userFound.roles
}
});
for (let i = 0; i < roles.length; i++) {
toles = roles[i].name
console.log(roles[i].name)
}
const token = jwt.sign({
id: userFound._id,
name: userFound.apellidos+" "+ userFound.nombres,//username
email: userFound.email,
foto: userFound.foto,
role: toles
}, config.SECRET, {
expiresIn: 86400, // 24 hours
});
res.json({
token
});
} catch (error) {
console.log(error);
}
};
//ctl
import { Router } from "express";
const router = Router();
import * as authCtrl from "../controllers/auth.controller";
import { verifySignup } from "../middlewares";
router.use((req, res, next) => {
res.header(
"Access-Control-Allow-Headers",
"x-access-token, Origin, Content-Type, Accept"
);
next();
});
router.post(
"/signup",
[verifySignup.checkDuplicateUsernameOrEmail, verifySignup.checkRolesExisted],
authCtrl.signUp
);
router.post("/signin", authCtrl.signin);
export default router;
本文标签: javascriptNode JS Login not workingStack Overflow
版权声明:本文标题:javascript - Node JS: Login not working - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1742203996a2432475.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论