21xrx.com
2024-11-05 19:31:57 Tuesday
登录
文章检索 我的文章 写文章
NodeJS用户登录实现
2023-07-04 23:51:16 深夜i     --     --
NodeJS 用户登录 实现 加密 权限验证

作为一种服务器端JavaScript运行环境,Node.js的使用已经越来越普遍。在Web开发中,用户登录功能是一个非常常见的需求。接下来,我们将介绍如何在Node.js中实现用户登录功能。

首先,需要建立一个用户数据表,用于存储用户信息。我们可以使用MySQL或MongoDB等数据库来实现。在本文中,我们将使用MySQL作为数据存储工具。

接下来,需要实现用户注册和用户登录等功能。用户注册通常包括用户名、密码、电子邮件等信息。为了安全考虑,密码需要进行加密处理。用户登录则需要验证用户名和密码是否正确。

为了实现这些功能,我们可以使用Node.js的一些第三方模块,如Express、Passport等。下面是一个示例代码来实现用户注册和用户登录。


const express = require('express');

const bodyParser = require('body-parser');

const session = require('express-session');

const MySQLStore = require('express-mysql-session')(session);

const bcrypt = require('bcryptjs');

const passport = require('passport');

const LocalStrategy = require('passport-local').Strategy;

const app = express();

const options =

  password: '';

const sessionStore = new MySQLStore(options);

app.use(bodyParser.urlencoded({ extended: true }));

app.use(bodyParser.json());

app.use(session({

  secret: 'my session secret',

  resave: false,

  saveUninitialized: false,

  store: sessionStore,

  cookie: {

    maxAge: 1000 * 60 * 60 * 24 // 1 day

  }

}));

passport.use(new LocalStrategy((username, password, done) => {

  const query = `SELECT * FROM users WHERE username = '${username}'`;

  db.query(query, (err, results) => {

    if (err) {

      return done(err);

    }

    if (results.length === 0) {

      return done(null, false, { message: 'Incorrect username.' });

    }

    const user = results[0];

    bcrypt.compare(password, user.password, (err, res) => {

      if (err) {

        return done(err);

      }

      if (!res) {

        return done(null, false, { message: 'Incorrect password.' });

      }

      return done(null, user);

    });

  });

}));

passport.serializeUser((user, done) => {

  done(null, user.id);

});

passport.deserializeUser((id, done) => {

  const query = `SELECT * FROM users WHERE id = ${id}`;

  db.query(query, (err, results) => {

    if (err) {

      return done(err);

    }

    const user = results[0];

    done(null, user);

  });

});

app.use(passport.initialize());

app.use(passport.session());

app.get('/', (req, res) => {

  res.send('Welcome to Node.js login demo!');

});

app.get('/signup', (req, res) => {

  res.render('signup');

});

app.post('/signup', (req, res) => {

  const password = req.body;

  bcrypt.hash(password, 10, (err, hash) => {

    if (err) {

      console.error(err);

    }

    const query = `INSERT INTO users (username, email, password) VALUES ('${username}', '${email}', '${hash}')`;

    db.query(query, (err, results) => {

      if (err) {

        console.error(err);

      }

      console.log(`User signed up: ${username}`);

      res.redirect('/login');

    });

  });

});

app.get('/login', (req, res) => {  

  res.render('login');

});

app.post('/login', passport.authenticate('local', failureRedirect: '/login' ));

app.listen(3000, () => {

  console.log('Server is listening on port 3000!');

});

在这个示例代码中,我们使用了Express框架来构建Web应用,同时使用Passport模块来实现用户认证。

在用户注册中,我们使用了bcrypt模块来加密密码,保证用户数据的安全性。

在用户登录中,我们使用了passport-local策略来实现本地身份验证。对于每个用户,我们通过查询数据库来获取用户信息,并使用bcrypt模块来验证密码的正确性。

最后,我们运行了一个HTTP服务器,监听在3000端口。当用户访问根路由时,返回欢迎信息。当用户访问/signup路由时,返回用户注册表单。当用户访问/login路由时,返回用户登录表单。

在该示例代码中,我们只实现了最基本的用户注册和登录功能。如果您需要更多的功能,如用户身份验证、用户管理等,您可以根据具体需求进行修改和扩展。

总之,使用Node.js实现用户登录功能是非常容易的。通过使用第三方模块,我们可以快速地构建一个安全、可靠的用户系统。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复