用户注册,对密码进行加密,需要使用bcryptjs
包,先来安装它
yarn add bcryptjs
用户登录,生成token
,需要安装jsonwebtoken
包
yarn add jsonwebtoken
dotenv
,可以用来配置环境变量,这里用来存储加密用的SECRET
yarn add dotenv
安装完成后,在项目根目录建一个.env
文件,里面加上
SECRET=随便写一段字符串
例如:
SECRET=clwy.cn
在根目录app.js
中引用
require('dotenv').config()
var bcrypt = require('bcryptjs');
router.post('/', async function (req, res, next) {
const name = req.body.name
const password = req.body.password.toString()
// 基础验证
if (!name) {
return res.json({status: false, msg: "用户名必须填写"})
}
if (!password) {
return res.json({status: false, msg: "密码必须填写"})
}
let user = await models.User.findOne({where: {name: name}});
if (user) {
return res.json({status: false, msg: "用户名已经存在,请直接登录!"})
}
// 生成盐
const salt = bcrypt.genSaltSync(10);
// 对用户填写的密码进行加密
const hash = bcrypt.hashSync(password, salt);
const body = {
...req.body,
password: hash
}
// 插入数据库中
user = await models.User.create(body);
res.json({
status: true,
data: {
user: user
}
}
);
});
新建一个/routes/admin/auth.js
路由文件
var bcrypt = require('bcryptjs');
var jwt = require('jsonwebtoken');
router.post('/', async function (req, res, next) {
const name = req.body.name
const password = req.body.password
// 检查账号
const user = await models.User.findOne({where: {name: name}});
if (!user) {
return res.json({
status: false,
msg: '用户不存在,请先注册后再登录!'
})
}
// 使用compareSync方法来检查密码是否正确
const checkPassword = bcrypt.compareSync(password, user.password);
if (!checkPassword) {
return res.json({
status: false,
msg: '密码错误!'
})
}
// 生成有效期为7天的 token
// process.env.SECRET 是读取 .env 文件中填写的内容
const token = jwt.sign({
user: {
id: user.id,
name: user.name
}
}, process.env.SECRET, {expiresIn: 60 * 60 * 24 * 7});
res.json({token: token})
});
根目录下新建/middlewares/checkAuth.js
文件
var jwt = require('jsonwebtoken');
module.exports = function (options) {
return function (req, res, next) {
// 如果没有提供 token,直接提示错误
var token = req.headers.token;
if (!token) {
return res.status(401).send({
success: false,
message: '当前接口需要认证才能访问'
});
}
// 验证token是否正确
jwt.verify(token, process.env.SECRET, function (err, decoded) {
if (err) {
if (err.name == "TokenExpiredError") {
return res.status(401).send({
success: false,
message: 'token已经过期,请重新登录!'
});
}
if (err.name == "JsonWebTokenError") {
return res.status(401).send({
success: false,
message: 'token 错误,请重新登录!'
});
}
}
// decoded里面装的是解密出来的是,之前加密生成token的东西
// 解析出来的数据存入req
req.decoded = decoded;
next();
})
}
}
在app.js
中,后台的路由中,添加上中间件
var checkAuth = require('./middlewares/checkAuth')
// ...
app.use('/admin/categories', checkAuth(), adminCategoriesRouter);
现在请求接口,就必须提供token
才能访问了。
在各个路由文件中,可以使用req.decoded.user
将登录时存储的用户信息读取出来。
已添加到喜欢了