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日

相关文章

  • 详解nodeJs文件系统(fs)与流(stream)

    下面是对Node.js文件系统(fs)和流(stream)的详解攻略。 fs模块的介绍 Node.js的fs模块提供了一组丰富的API用于文件系统操作,包括文件的读取、写入、修改、删除等。该模块使用同步或异步的方式访问文件系统,可以操作各种类型的文件,包括文本、图片、视频、音频等。 fs的常见API 以下是一些最常用的fs API: 读取文件: fs.rea…

    node js 2023年6月8日
    00
  • node.js实现多图片上传实例

    具体的攻略如下: 1. 安装依赖 在开始项目前,需要先安装所需的依赖: npm install express multer 其中,express是Node.js的Web框架,用于创建服务器;multer是Node.js的一个中间件,用于处理HTTP上传请求,支持多文件上传。 2. 编写HTML页面 需要先编写一个HTML页面,用于展示表单和上传控件。以下为…

    node js 2023年6月8日
    00
  • node.js中的Socket.IO使用实例

    当提到实现实时的网络通信时,Socket.IO可以说是一个非常不错的选择。 它是用 Node.js 实现的,可以让你轻松地在前后端之间建立实时、双向、基于事件的通信。 下面我将提供一个 Socket.IO 的使用实例,以便了解如何在 Node.js 服务器和客户端之间使用它来实现实时通信。 安装Socket.IO 在开始使用Socket.IO之前,我们需要确…

    node js 2023年6月8日
    00
  • 详解nodeJS之路径PATH模块

    详解Node.js之路径模块(Path module) 简介 在Node.js中,核心模块之一是路径模块(Path module)。该模块提供了处理和转换文件路径的工具方法。 使用方式 在Node.js中,我们可以使用require关键字导入路径模块。例如: const path = require(‘path’); 在导入模块后,我们可以使用该模块提供的方…

    node js 2023年6月8日
    00
  • Node.js + Redis Sorted Set实现任务队列

    下面是关于“Node.js + Redis Sorted Set实现任务队列”的完整攻略。 什么是任务队列 任务队列是一种用于处理异步任务的机制,在异步任务处理过程中,时常需要将任务放到队列中依次执行。常见的任务队列应用场景有多种,例如:邮件投递、消息提醒等。在这些场景下,任务的执行需要满足先进先出的原则。 Redis Sorted Set Redis So…

    node js 2023年6月8日
    00
  • 实例详解Nodejs 保存 payload 发送过来的文件

    下面是关于“实例详解Nodejs 保存 payload 发送过来的文件”的完整攻略: 1. 背景说明 在开发web应用程序时,经常需要通过上传文件的方式与客户端进行交互。客户端可以通过表单提交文件数据,也可以通过使用JavaScript编写发送文件的客户端来向服务器发送文件。 本文主要介绍使用Node.js处理通过POST请求发送的文件上传数据。 2. 如何…

    node js 2023年6月8日
    00
  • node实现mock-plugin中间件的方法

    Node.js是一个可以运行JavaScript的开发平台,可以用它来实现服务器端的编程,也可以使用它来开发命令行工具。Mock-plugin中间件是一个常用的Web前端开发工具,可以提供本地开发时的Mock数据服务,Webpack、Gulp、Grunt、Browserify等开源工具可以通过在构建阶段注入插件的方式实现Mock功能。 以下是实现Node实现…

    node js 2023年6月8日
    00
  • node.js实现身份认证的示例代码

    首先,我们需要了解身份认证的基本概念和流程。身份认证是指验证用户所提供的身份信息是否正确和有效。在前后端分离的应用中,身份认证通常采用 token 认证的方式,即客户端在登录后,向服务端获取 token 并保存到本地,后续的每次请求需要带上这个 token 来进行身份认证。在 node.js 中,主要使用 express 和 jsonwebtoken 两个库…

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