5分钟了解 NodeJS 密码加密 + Token生成 jsonwebtoken &bcryptjs

 想写个简介写了又删,删了又写,实在想不出什么好的词汇了.这个topic其实对于很多前端和全栈来说涉及的不多,毕竟在一个项目中nodejs的密码加密和token的部分在你入职的时候已经有人完成了,如果一个新项目要求从0开始或者想扩展下实践的技术栈不妨来了解下.

0.准备工作

  • Nodejs既然是Nodejs作为后端,首先我们要有一个nodejs的环境.推荐>=18.
  • Ejs.做nodejs的都了解,nodejs模版引擎
  • nodemon:让nodejs service持久化

  • express不多说了

  • 还有其他一些插件后续用到再做说明

1.Express替换模版引擎

传统方法直接新建文件

mkdir myapp
cd muapp 
npm init

来点不一样的,使用express generator来一步搞定

mkdir myapp
cd myapp 
npx express-generator

看下目录结构

不错,继续 npm i  创建node_moduls初始化我们的express项目.执行npm run start or yarn start
看下效果,虽然大多数时候我们用不到UI界面,但是开发和测试的时候还是得有个界面方便我们调试开发这比纯后端的摸黑开发好很多.

习惯了手动配置端口的可能有点陌生,端口在哪?bin->www

### 使用 Node.js 和 MySQL 实现用户登录功能 为了实现基于 Node.js 和 MySQL 的用户登录功能,可以按照如下结构构建应用程序。此过程涉及创建服务器端逻辑来处理用户的注册和验证请求。 #### 创建项目并安装依赖项 首先初始化一个新的 Node.js 项目,并安装必要的包: ```bash npm init -y npm install express mysql2 bcryptjs jsonwebtoken body-parser dotenv cors ``` 这些软件包提供了 Web 应用程序框架 (Express),数据库连接器 (mysql2),密码哈希工具 (bcryptjs),用于生成 JSON Web Tokens (jsonwebtoken),解析 HTTP 请求体的支持 (body-parser),环境变量管理 (dotenv) 及跨域资源共享支持(cors)[^1]。 #### 设置 .env 文件 为保护敏感数据,在项目的根目录下创建 `.env` 文件以存储配置参数: ```plaintext DB_HOST=localhost DB_USER=root DB_PASSWORD=password DB_NAME=login_db JWT_SECRET=mysecretkey PORT=3000 ``` #### 配置数据库表 确保已设置好 MySQL 数据库,并执行 SQL 脚本来建立 `users` 表: ```sql CREATE DATABASE IF NOT EXISTS login_db; USE login_db; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, password_hash CHAR(60) NOT NULL ); ``` #### 编写路由处理器 定义两个主要 API 接口 `/api/register` 和 `/api/login` 来分别负责新账户注册以及现有账号的身份验证操作。 ##### 注册接口 (`/api/register`) 接收 POST 请求并将经过加密后的用户名与密码保存到数据库中。 ```javascript const express = require('express'); require('dotenv').config(); const bodyParser = require('body-parser'); const bcrypt = require('bcryptjs'); const jwt = require('jsonwebtoken'); const { Pool } = require('mysql2/promise'); // 初始化 Express 应用实例 const app = express(); app.use(bodyParser.json()); app.use((req, res, next) => { res.header("Access-Control-Allow-Origin", "*"); res.header( "Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept" ); next(); }); async function createConnection() { const pool = new Pool({ host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME }); return pool.getConnection(); } app.post('/api/register', async (req, res) => { try { let connection; try { const { username, password } = req.body; // Hash the password before storing it into DB. const hashedPassword = await bcrypt.hash(password, 8); connection = await createConnection(); await connection.query(`INSERT INTO users (username, password_hash) VALUES (?, ?)`, [username, hashedPassword]); res.status(201).send({ message: 'User registered successfully.' }); } finally { if (connection) connection.release(); } } catch (error) { console.error(error); res.status(500).json({ error: 'An unexpected error occurred' }); } }); ``` ##### 登录接口 (`/api/login`) 接受来自客户端的凭证信息,查询对应的记录并对提交过来的明文密码做对比校验;如果匹配成功,则返回带有有效载荷(payload)的一次性令牌给前端应用以便后续访问受保护资源时携带该 token 进行身份认证。 ```javascript app.post('/api/login', async (req, res) => { try { let connection; try { const { username, password } = req.body; connection = await createConnection(); const result = await connection.execute('SELECT * FROM users WHERE username=? LIMIT 1;', [username]); const user = result[0][0]; if (!user || !(await bcrypt.compare(password, user.password_hash))) { throw new Error('Invalid credentials.'); } const payload = { userId: user.id }; const token = jwt.sign(payload, process.env.JWT_SECRET, { expiresIn: '1h' }); res.send({ accessToken: token }); } finally { if (connection) connection.release(); } } catch (err) { console.log(err.message); res.status(401).json({ error: err.message }); } }); ``` 最后启动服务监听指定端口号上的传入连接请求: ```javascript const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); }); ``` 上述代码片段展示了如何利用 Node.js 和 MySQL 构建基本的安全机制来完成用户注册及登录流程[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值