nodejs实现登陆验证功能

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,许多 Web 项目都使用 Node.js 来实现后端服务。在 Web 开发中,登陆验证功能是非常常见的一个需求,本文将详细讲解如何使用 Node.js 实现登陆验证功能。

实现思路

登陆验证功能的实现一般分为以下几个步骤:

  1. 创建登录页面,用户输入账号密码提交登录请求。
  2. 服务器接收登录请求,验证账号密码是否正确,如果正确则生成令牌(token)并返回给客户端,否则返回登录失败信息。
  3. 客户端在接收到令牌后,将令牌存储在浏览器的 Cookie 或者 LocalStorage 中,用于以后的访问验证。
  4. 客户端之后的访问需要携带令牌信息,服务端验证令牌是否正确,如果正确则允许访问,否则返回禁止访问信息。

下面,我们将对上述步骤进行详细说明。

创建登录页面

我们可以使用 HTML 和 CSS 创建一个简单的登录页面,例如:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Login</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="container">
        <form>
            <div>
                <label for="username">Username:</label>
                <input type="text" id="username" name="username" required>
            </div>
            <div>
                <label for="password">Password:</label>
                <input type="password" id="password" name="password" required>
            </div>
            <input type="submit" value="Login">
        </form>
    </div>
</body>
</html>

我们将表单的提交方式设置为“post”,这样提交的数据不会被显示在 URL 中。点击“Login”按钮会向服务器发送登录请求。

服务器接收登录请求

在 Node.js 中,可以使用 Express 框架来快速搭建 Web 服务器。下面是一个基本的 Express 服务器示例代码:

const express = require('express');
const app = express();

app.use(express.json());
app.use(express.urlencoded({ extended: false }));

app.post('/login', (req, res) => {
    const { username, password } = req.body;
    // TODO: 验证账号密码是否正确
    if (username === 'admin' && password === '123456') {
        const token = 'xxx'; // TODO: 生成令牌
        res.json({ code: 0, token });
    } else {
        res.json({ code: -1, message: '用户名或密码错误' });
    }
});

app.listen(3000, () => {
    console.log('Server is running on port 3000.');
});

我们创建了一个路由为“/login”的 post 请求,用于接收登录请求。在请求体中获取用户名和密码,然后进行验证。如果验证通过,生成一个令牌,返回给客户端。

客户端存储令牌

客户端在接收到令牌后,需要将令牌存储在浏览器的 Cookie 或者 LocalStorage 中,用于以后的访问验证。这里以 Cookie 为例,存储令牌的代码如下:

fetch('/login', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({ username, password })
}).then(res => res.json())
  .then(res => {
      if (res.code === 0) {
          document.cookie = `token=${res.token}`;
      } else {
          alert(res.message);
      }
  });

这里使用 Fetch API 发送 POST 请求获取服务器返回结果,然后判断返回的状态码。如果状态码为 0,则说明登录成功,将令牌存储在 Cookie 中。Cookie 的值应该是一个字符串,包含键值对“token=xxx”的形式。

验证令牌

客户端之后的访问需要携带令牌信息,服务端验证令牌是否正确,如果正确则允许访问,否则返回禁止访问信息。下面是基本的服务器验证代码:

app.get('/api/data', (req, res) => {
    const { token } = req.cookies;
    if (!token) {
        res.status(403).json({ message: '无权访问' });
    } else {
        // TODO: 验证 token 是否正确
        if (token === 'xxx') {
            res.json({ message: '成功访问数据' });
        } else {
            res.status(403).json({ message: '无权访问' });
        }
    }
});

我们创建了一个路由为“/api/data”的 get 请求,用于获取数据。先从 Cookie 中获取令牌,如果令牌不存在,则返回“无权访问”信息,否则验证令牌是否正确。如果令牌正确,则返回数据信息,否则返回“无权访问”信息。

示例说明

下面是一个完整的示例,模拟了用户登录和获取数据的功能。输入用户名“admin”和密码“123456”即可登录成功,并获取数据。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Login</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="container">
        <form>
            <div>
                <label for="username">Username:</label>
                <input type="text" id="username" name="username" required>
            </div>
            <div>
                <label for="password">Password:</label>
                <input type="password" id="password" name="password" required>
            </div>
            <input type="submit" value="Login">
        </form>
        <button id="get-data">Get data from server</button>
    </div>
    <script>
        const loginForm = document.querySelector('form');
        const getDataBtn = document.querySelector('#get-data');
        const usernameInput = document.querySelector('#username');
        const passwordInput = document.querySelector('#password');

        loginForm.addEventListener('submit', event => {
            event.preventDefault();
            const username = usernameInput.value;
            const password = passwordInput.value;
            fetch('/login', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({ username, password })
            }).then(res => res.json())
              .then(res => {
                  if (res.code === 0) {
                      document.cookie = `token=${res.token}`;
                      alert('Login success!');
                  } else {
                      alert(res.message);
                  }
              });
        });

        getDataBtn.addEventListener('click', () => {
            fetch('/api/data', {
                credentials: 'include'
            }).then(res => res.json())
              .then(res => {
                if (res.message) {
                    alert(res.message);
                } else {
                    alert('Data received!');
                }
              });
        });
    </script>
</body>
</html>
const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();

app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());

app.post('/login', (req, res) => {
    const { username, password } = req.body;
    if (username === 'admin' && password === '123456') {
        const token = 'xxx';
        res.json({ code: 0, token });
    } else {
        res.json({ code: -1, message: '用户名或密码错误' });
    }
});

app.get('/api/data', (req, res) => {
    const { token } = req.cookies;
    if (!token) {
        res.status(403).json({ message: '无权访问' });
    } else {
        if (token === 'xxx') {
            res.json({ message: '成功访问数据' });
        } else {
            res.status(403).json({ message: '无权访问' });
        }
    }
});

app.listen(3000, () => {
    console.log('Server is running on port 3000.');
});

注意事项:

  • 在客户端发送请求时需要添加“credentials: 'include'”选项,表示发送 Cookie。
  • 在服务器端需要引入 cookie-parser 中间件解析 Cookie。
  • 实际应用中需要根据具体的需求生成并验证令牌,避免出现安全漏洞。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:nodejs实现登陆验证功能 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 解决npm run serve启动报错npm ERR Missing script:”serve”

    当使用npm run serve启动项目时,有时候会遇到npm ERR Missing script:”serve”的错误。这个问题通常由以下几个原因造成: 没有在package.json文件中定义serve脚本。 serve脚本中的命令错误或无效。 下面是解决这个问题的完整攻略: 步骤1 – 确认package.json文件中定义有serve脚本 打开项目…

    node js 2023年6月8日
    00
  • node执行cmd或shell命令使用介绍

    Node.js提供了child_process模块来执行cmd或shell命令。在本攻略中,我将介绍如何使用Node.js的child_process模块来执行cmd或shell命令。下面是完整攻略的步骤: 1. 引入child_process模块 在使用child_process模块之前,需要先引入该模块。可以在文件顶部添加以下代码引入child_proc…

    node js 2023年6月8日
    00
  • node实现封装一个图片拼接插件

    下面给出详细的步骤说明。 1. 安装依赖 由于本项目需要使用到图片处理和文件操作相关的模块,因此需要先安装相应的依赖包,包括jimp和fs,其中jimp用来实现图片的处理功能,fs用来实现文件操作的功能 npm install jimp –save 2. 创建项目工程 创建一个空目录用于存储该项目文件,并在该目录下初始化一个node工程: mkdir im…

    node js 2023年6月8日
    00
  • 安装node.js和npm的一些常见报错

    下面是安装node.js和npm的一些常见报错及其解决方案的完整攻略: 安装Node.js和npm常见报错及解决方案 报错1:执行node命令,提示“node不是内部或外部命令,也不是可运行的程序或批处理文件。” 这说明系统的环境变量中没有添加Node.js的安装路径。 解决方案:在系统的环境变量中添加Node.js的安装路径。 首先需要找到Node.js的…

    node js 2023年6月8日
    00
  • 使用node.js实现微信小程序实时聊天功能

    使用node.js实现微信小程序实时聊天功能,需要以下几个步骤: 1. 创建小程序 首先,在微信公众平台注册账号,在小程序管理页面中创建小程序。 2. 创建后台服务 前往阿里云或者其他云服务商申请服务器,并安装Node.js环境。进入控制台,使用命令行工具创建一个Node.js项目,进入项目目录后,需要安装以下模块: npm install express …

    node js 2023年6月8日
    00
  • 20行代码简单实现koa洋葱圈模型示例详解

    20行代码简单实现koa洋葱圈模型示例详解 基础知识 Koa Koa是一个Node.js的Web开发框架,它使用了ES6的新特性,并且没有内置的中间件。 什么是中间件 Koa中的中间件是一个函数,它们可以被串连在一起构成一个请求的处理流程。中间件函数的参数是ctx和next,ctx包含了请求上下文,next是下一个中间件函数。 洋葱圈模型 Koa的处理流程采…

    node js 2023年6月8日
    00
  • node.js同步/异步文件读写-fs,Stream文件流操作实例详解

    Node.js 同步/异步文件读写 在 Node.js 中,操作文件系统是很常见的任务。Node.js 提供了 fs 核心模块来实现文件系统操作。 fs 模块同时支持同步和异步方法。 fs 同步方法 在 fs 同步操作中,当一个文件操作请求执行时,程序会等待它执行完成后再往下执行。 以下是一些常见的 fs 同步方法: fs.readFileSync(): 读…

    node js 2023年6月8日
    00
  • 一文秒懂nodejs中的异步编程

    一文秒懂Node.js中的异步编程 什么是异步编程 JavaScript是一种单线程的编程语言,它只能在一个线程中处理事件,并按照顺序执行代码。当在执行某个任务时,如果需要等待某个结果返回,传统的写法是阻塞该线程,直到结果返回后才继续执行下一步。这种方式的缺点是效率低下,因为大部分时间都是在等待,浪费了CPU的处理能力。 异步编程的思想就是在等待某个结果返回…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部