节点Js中的用户名密码验证

时间:2014-08-13 05:58:54

标签: javascript jquery html5 node.js

请...我是Node js的新手

我为了学习目的而尝试这个

我创建了 server.js 文件

var http=require('http');
var flash = require('connect-flash');
var express=require('express');
var fs=require('fs');
var mysql=require('mysql');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var session = require('express-session')
var app=express();
var server=http.createServer(app);
var User=[];
server.listen(8000);
var connection=mysql.createConnection({
    host:'****',
    user:'****',
    password:'****'
});  
connection.connect(function(Error,Res){
    if(!Error)
    {
        connection.query('USE USERS');
        connection.query( "select *from USERS",  function(err, rows){
            if(err) {
                throw err;
            }else{
                User.push(rows);
            }
        });
    }
});
app.get('/', function(request,response){
    fs.readFile('login.html', function(Error,Res){
        if(!Error)
        {
            response.writeHead(200,{'content-type':'text/html'});
            response.write(Res);
        }
    });
});
app.use(session({secret: '<mysecret>',saveUninitialized: true,resave: true}));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());

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

passport.deserializeUser(function(id, done) {
    done(err, user);
});
passport.use(new LocalStrategy(
    function(username, password, done) {
        User.findOne({ username: username }, function(err, user) {
            if (err) { return done(err); }
            if (!user) {
                return done(null, false, { message: 'Incorrect username.' });
            }
            if (!user.validPassword(password)) {
                return done(null, false, { message: 'Incorrect password.' });
            }
            return done(null, user);
        });
    }
));
app.post('/login',
    passport.authenticate('local', { successRedirect: '/',
                                  failureRedirect: '/login',
                                  failureFlash: true })
);

我不知道如何在节点js中使用护照验证用户名和密码,但无论如何我在上面尝试过这个

我的 login.html 类似于

<html>
<head>
    <title>login</title>
    <script src="assets/js/Angular.min.js"></script>
    <style>
    </style>
</head>
<body>
    <form action="/login" method="post">
        <div>
            <label>Username:</label>
            <input type="text" name="username"/>
        </div>
        <div>
            <label>Password:</label>
            <input type="password" name="password"/>
        </div>
        <div>
            <input type="submit" value="Log In"/>
        </div>
    </form>
</body>
</html>

我的SQL用户表有像

这样的数据
username:Admin,
password:Admin

我在运行浏览器并输入node server.js之后使用命令提示符http://localhost:8000运行server.js文件,我得到了以下屏幕

enter image description here

然后我输入用户名密码 管理管理,当我提交时我获得{{1我认为这意味着用户名密码错误,因为我指定了Cannot GET /login。但我提供了正确的用户名和密码,为什么我得到了failureRedirect: '/login'而不是Cannot GET /login。我在哪里可以做错?请帮助

1 个答案:

答案 0 :(得分:0)

这是什么, validPassword() 方法?你有定义吗?

我敢打赌,你没有。

因此,尝试向Passport中间件添加更多日志记录并跟踪控制台。像bellow这样的东西,我怀疑你根本不会得到错误日志,因为应用程序会在validPassword()之前失败:

passport.use(new LocalStrategy(
    function(username, password, done) {
        User.findOne({ username: username }, function(err, user) {
            if (err) {
                console.log('MySQL Error: ', err);
                return done(err);
            }
            if (!user) {
                console.log('Incorrect username error.');
                return done(null, false, { message: 'Incorrect username.' });
            }
            console.lg('Trying user.validPassword() call');
            if (!user.validPassword(password)) {
                console.log('Incorrect password.');
                return done(null, false, { message: 'Incorrect password.' });
            }
            console.log('All correct, user found: ', user);
            return done(null, user);
        });
    }
));