一、前言
通过本篇文章,你可掌握node.js关于注册用户、登录以及验证等相关知识,本篇中的代码块都处于一个文件index.js中。
二、相关技术点
主要工具
- vscode
- postman
- mysql
node相关包
- express
- body-parser
- bcryptjs
- jwt
三、文件准备
- 建立文件夹
- 打开 vscode 控制台,cd 进入到该目录,输入命令 npm init -y 创建 package.json 文件
-
安装相关包
- express
- mysql
- body-parser
- jsonwebtoken
- bcryptjs
- 创建 index.js文件
进行一些简单的配置
// 引入 mysql 连接数据库
const mysql = require("mysql");
// 数据库配置
// 我是利用 sqlyog 可视化工具建立的数据库 并且建立相应的表 user
const con = mysql.createConnection({
host: "localhost",
user: "root",
password: "123456",
port: 3306,
database: "blog",
});
// 定义一个执行 sql 语句的函数 并且返回一个 promise 对象
const exec = (sql) => {
const promise = new Promise((resolve, reject) => {
con.query(sql, (err, result) => {
resolve(result);
});
});
return promise;
};
// 连接数据库
con.connect();
// 引入其他相关包
const express = require("express");
var bodyParser = require("body-parser");
var bcrypt = require("bcryptjs");
const jwt = require("jsonwebtoken");
// 解析 post 请求体
app.use(bodyParser.json({ limit: "1mb" })); //body-parser 解析json格式数据
app.use(
bodyParser.urlencoded({
//此项必须在 bodyParser.json 下面,为参数编码
extended: true,
})
);
// 此变量为解析 token 密匙 变量比较隐私 应该放在其他地方 本文章简单使用一下
// 值为开发者随意设定的
const SECRET = "asdfjoijisadfjlkj";
// 创建服务器
const app = express();
// 监听3001端口
app.listen(3001, () => {
console.log("服务器启动");
});
四、接口编写
用户注册
- 密码不应该明文存储在数据库中,如果数据库被黑客入侵,就会非常危险,所以我们一般会将密码加密以后存储到数据库中,本篇文章用 bcryptjs 进行加密
- bcryptjs 介绍 https://segmentfault.com/a/11...
app.post("/register", (req, res) => {
const username = req.body.username;
// 密码进行加密
const password = bcrypt.hashSync(req.body.password, 10);
const sql = `insert into user (username, password) values ('${username}', '${password}')`;
exec(sql).then((result) => {
return;
});
res.send("用户注册成功");
});
用户登录
app.post("/login", (req, res) => {
// 从请求中获取请求体
const { username, password } = req.body;
const sql = `select * from user where username='${username}'`;
exec(sql).then((result) => {
const user = result[0];
// 如果查询不到用户
if (!user) {
res.send("用户名不存在");
return;
}
// 判断用户输入的密码和数据库存储的是否对应 返回 true 或者 false
const isPasswordValid = bcrypt.compareSync(password, user.password);
if (!isPasswordValid) {
res.send("密码错误");
return;
}
// 生成 token 将用户的唯一标识 id 作为第一个参数
// SECRET 作为取得用户 id 密匙
const token = jwt.sign({ id: user.id }, SECRET);
// 如果都通过了 则返回user 和 token
// 返回的 token 应该存储在客户端 以便后续发起请求需要在请求头里设置
res.send({ user, token });
});
});
用户登录后,才能访问的接口
app.get("/profile", (req, res) => {
// 从请求头里取出 token
const token = req.headers.authorization.split(" ")[1];
// token 验证取得 用户 id
const { id } = jwt.verify(token, SECRET);
// 查询用户
const sql = `select * from user where id='${id}'`;
exec(sql).then((result) => {
// 返回用户信息
res.send(result[0]);
});
});
五、总结
用户注册发起请求,后端将密码加密后存储到数据库表中。登录的时候,先根据 username查询数据库判断是否有该用户,没有则返回用户不存在,用户存在则将登录所传的密码与数据库的密码做对比,会返回 true 或者 false,若为 false,则返回密码错误,若为 true,则返回用户信息和 token 值。访问需要 token 验证的接口时,在请求头中拿到 token 并且根据 token 查询数据库得到该用户信息存在后,在进行接下来的操作。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。