Node.js + Express-jwt实现接口认证

一、简介

本次教程是基于之前的扫码购物项目的后台,实现后台登录注册接口认证。

二、实战步骤

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'
    ]
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值