一、简介
本次教程是基于之前的扫码购物项目的后台,实现后台登录注册接口认证。
二、实战步骤
1、创建数据表(Users)
注:Windows电脑自行手动创建,并添加数据
sequelize model:generate --name User --attributes username:string,password:string,openid:string,admin:boolean
sequelize db:migrate #运行迁移
手动往表里面添加一个用户
2、配置路由,在app.js
文件中,屏蔽之前的usersRouter
,添加如下代码:
var usersRouter = require('./routes/admin/users');
***
app.use('/admin/users', usersRouter);
3、安装接口认证包文件,参考文档:https://github.com/auth0/express-jwt#readme
cnpm install express-jwt --save
var jwt = require('express-jwt'); #app.js中引入
4、在routes/admin
文件夹中创建users.js
文件,里面写上登录接口代码:
var models = require('../../models');
var jwt = require('jsonwebtoken');
**********************************
//登录接口
router.post('/login', function (req, res, next) {
var username = req.body.username
var password = req.body.password
if (!username || !password) {
res.json({
success: false, message: '用户名或密码错误!'})
return;
}
models.User.findOne({
where: {
username: username,
password: password,
}
}).then(user => {
if (!user) {
res.json({
success: false, message: '用户名或密码错误!'})
}
var token = jwt.sign({
user: user }, '123123');
res.json({
success: true,
message: '请求成功',
token: token
})
})
});
module.exports = router;
解析:里面的jwt.sign
方法,参考文档:https://github.com/auth0/node-jsonwebtoken
测试:打开postman
,做如下测试,若得到token
即为成功!
5、接下来,在app.js中,添加如下代码:
app.use(express.static(path.join(__dirname, 'public'))); #此行代码以自带
app.use(jwt({
secret: '123123'}));
然后postman
中访问商品分类接口,应该会报错,如图:
接下来,在该接口中,带上如下参数,即可访问。
authorization Bearer空格token
如图所示:
后面所有接口测试中都要带上此请求头才能拿到数据。
6、接下来获取接口认证成功的用户id
,在商品分类接口首页中,修改代码如下:
// 所有分类
router.get('/', function (req, res, next) {
// models.Category.findAll({order: [['id', 'DESC']]}).then(categories => {
// res.json({categories: categories});
// })
res.json(req.user); #打印用户信息
});
postman
测试,如图
那么,获取用户id
的写法应该就是
res.json(req.user.user.id);
此写法明显不优雅,后面的代码继续优化!
7、由于目前密码在数据表中存的是明文的,不安全,所以需要对密码进行加密处理。参考文档:https://github.com/dcodeIO/bcrypt.js#readme
cnpm install bcryptjs --save #安装密码加密包
var bcrypt = require('bcryptjs'); #在`users.js`中引入
然后在users.js
中增加注册接口,代码如下:
router.post('/register', function (req, res, next) {
var username = req.body.username
var password = req.body.password
var check_password = req.body.check_password
if (!username || !password) {
res.json({
success: false, message: '用户名或密码必填!'})
return;
}
if(check_password != password){
res.json({
success: false, message: '两次密码输入不一致!'})
return;
}
models.User.findOne({
where: {
username: username,
}
}).then(user => {
if (user) {
res.json({
success: false, message: '用户名已注册!'})
return;
}
password = bcrypt.hashSync(password, 8);
// res.json({password: password})
models.User.create({
username: username,
password: password,
admin: true
}).then((user) => {
res.json({
success: true,
message: '请求成功',
user: user
})
});
})
});
postman
中测试注册接口,提示失败,如图所示:
出现此问题是因为,登录和注册不需要经过接口认证,所以要排除这个两个路由。在app.js
中,修改代码如下:
//后台登录接口认证
app.use(jwt({
secret: '123123'}).unless({
path: [
'/admin/users/login',
'/admin/users/register'
]
}