【问题标题】:Username password validation in node Js节点 Js 中的用户名密码验证
【发布时间】:2014-08-13 16:45:44
【问题描述】:

请..我是 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

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

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

【问题讨论】:

  • 我尝试点击图片....我知道这是图片,我仍然尝试点击它。
  • select *from USERS 缺少空格:* from,服务器控制台应该打印错误。
  • 错误Cannot GET /login 指向不正确的请求。 /login 路由仅定义为响应 POST 请求 (app.post('/login', ...)),而是向其发送 GET 请求。
  • 请朋友们。至少在我的 sql 数据库的帮助下,在节点 js 中提供用户名密码验证的简单示例
  • @Xero 我喜欢那些让我哈哈大笑的罕见的题外话,伙计,我点击了 10 次.. Arunkumar,我会像在任何地方一样做其他语言:SELECT * FROM users WHERE username = ? LIMIT 1 然后if (result.username == username &amp;&amp; result.password == crypt.XXX(password)) { // success } else { // no success }

标签: javascript jquery html node.js


【解决方案1】:

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

我敢打赌你不会。

因此,尝试向 Passport 中间件添加更多日志记录并跟踪控制台。像下面这样,我怀疑你根本不会收到错误日志,因为应用程序将在 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);
        });
    }
));

【讨论】:

  • 是的 validPassword() 我没有定义。如果我将控制台放在函数中,它不会被调用???为什么上面的函数没有执行???
  • 因为如果要使用validPassword()方法,需要先定义。您的密码如何存储在数据库中?纯文本还是加密?您需要本质上定义一个函数validPassword(password),它将接受参数并检查该数据库字段。 IE。如果是纯文本,则比较密码和存储的文本,如果您对其进行哈希处理,则对您的输入进行哈希处理并进行比较,或者使用您最初用于存储密码的某种加密方法。
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 2015-04-28
  • 2020-04-26
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多