资讯专栏INFORMATION COLUMN

4.4 权限拦截控制AccessToken jwt-博客后端Api-NodeJs+Express+

CoXie / 1683人阅读

摘要:权限控制业务需求查看用户列表接口管理员才能使用更新用户信息接口当前对应用户才能调用这时候需要需要加入中间件来实现权限控制这时候咱们需要学习了解下课前学习了解入门教程基于的认证版实现本文中使用了插件现将服务逻辑代码附上服务配置设置创

权限控制
业务需求:查看用户列表接口(管理员才能使用)、更新用户信息接口(当前对应用户才能调用)

这时候需要需要加入中间件来实现权限控制:

这时候咱们需要学习了解下 :AccessToken jwt

AccessToken jwt
课前学习了解
JSON Web Token 入门教程
http://www.ruanyifeng.com/blo...
基于jsonwebtoken(JWT) 的web认证 (Node版实现)
https://segmentfault.com/a/11...
node-jsonwebtoken
https://github.com/auth0/node...

本文中使用了node-jsonwebtoken@7.2.1插件

现将token服务逻辑代码附上

/**
 * token服务
 * add by boomer 2019-05-03 21:57:11
 */
var Promise = require("bluebird");
var config = require("config-lite"); //配置
var jwt = require("jsonwebtoken"); //json token

module.exports = {
    /**
     * 设置token 创建token
     */
    setToken: function(payload) {
        // var expiresIn = Math.floor(Date.now() / 1000) + (1 * 60); // var expiresIn = "24h";
        var expiresIn = Date.now() + 3600000 * 24;//24小时后
        var token = jwt.sign(payload, config.token.secretOrPrivateKey, {
            expiresIn: expiresIn, // 设置过期时间
        });
        return {
            token: token,
            expiresIn: expiresIn,
        };
    },
    /**
     * 验证token是否正确:传入当前token和当前用户uuid
     */
    verifyToken: function(token, userUuid){
        return new Promise(function(resolve, reject) {
            jwt.verify(token, config.token.secretOrPrivateKey, function(err, tokenData) {
                if (tokenData && tokenData.uuid == userUuid) {
                    resolve("ok");
                }else{
                    reject("fail");
                }
            });
        });
    },
    /**
     * 路由验证token
     */
    verifyRouterToken: function(req, res, next, isAdmin) {
        //accesstoken 被自动转小写了
        var token = req.headers.accesstoken;
        if (!token) { // 如果没有token,则返回错误
            res.json({
                code: "401",
            });
            return;
        } else { //验证token
            jwt.verify(token, config.token.secretOrPrivateKey, function(err, tokenData) { //只有在token正确时tokenData有值
                if (err) {
                    res.json({
                        code: "402",
                    });
                    return;
                } else {
                    //验证是否为管理员
                    if (isAdmin && !tokenData.isAdmin) {
                        res.json({
                            code: "403",
                        });
                        return;
                    } else if (!isAdmin && tokenData.uuid && !tokenData.isAdmin) {
                        //验证userUuid 避免普通用户登录修改其他人资料
                        var userUuid = (req.body || req.query || req.params)["userUuid"];
                        if (userUuid && userUuid != tokenData.uuid) {
                            res.json({
                                code: "403",
                            });
                            return;
                        } else {
                            next();
                        }
                    } else {
                        next();
                    }
                }
            });
        }
    },
    /**
     * 清除token
     */
    delToken: function(token) {
        if (!token) {
            return "delTokenFail";
        } else {
            jwt.decode(token);
            return "delTokenSuccess";
        }
    },
};

accessToken一般在登录/注册成功时获取 然后缓存到本地,每次前端请求时将有效的accessToken放到headers中(这块后面写前端时补充 更新token心跳机制等),然后请求到后端,后端再通过校验token中间件做权限拦截,校验通过后才能执行后面的业务逻辑
现在说下,后端通过上面tokenService.setToken方法 生成AccessToken的代码:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/104076.html

相关文章

  • NodeJs+Express+Mysql + Vuejs 项目实战 - 大纲

    摘要:多一个技能多一条出路,祝你在自学道路上越走越好,掌握自己的核心技能,不只是优秀,还要成为不可替代的人 NodeJs+Express+Mysql + Vuejs 项目实战 最近准备写一系列文章,全面讲述如何基于NodeJs + Express + Mysql + Vuejs 从零开发前后端完全分离项目; 文笔及技术可能在某些方面欠佳,请您指正,共同学习进步 前端:Vuejs全家桶 后端:...

    noONE 评论0 收藏0
  • 4.1 开发环境目录结构配置文件功能梳理-博客后端Api-NodeJs+Express+Mys

    摘要:从本章开始,正式学习如何使用搭建一个博客。但通常我们都会有许多环境,如本地开发环境测试环境和线上环境等,不同的环境的配置不同,我们不可能每次部署时都要去修改引用或者。会根据环境变量的不同从当前执行进程目录下的目录加载不同的配置文件。 从本章开始,正式学习如何使用 Nodejs + Express + Mysql 搭建一个博客。 开发环境 首先说下开发环境安装的核心依赖版本: Node....

    DevWiki 评论0 收藏0
  • 4.3 路由设计/RESTful API-博客后端Api-NodeJs+Express+Mysql实

    摘要:路由设计路由设计以用户注册为例介绍如何闭环用户注册开发注意点使用邮箱注册验证邮箱是否注册目前真实开发业务大部分都是手机号注册,这块由于没有购买短信服务首先,在文件夹下新建上图中对应真实业务逻辑现附上业务实现代码加密国际化工具类用户服务 路由设计 路由设计 以用户注册为例介绍如何闭环用户注册开发注意点:(1)使用邮箱注册(2)验证邮箱是否注册 【目前真实开发业务大部分都是手机号注册,这块...

    1fe1se 评论0 收藏0
  • 4.9 跨域cors-博客后端Api-NodeJs+Express+Mysql实战

    摘要:跨域跨域请求也可以使用代表允许所有此时咱们启动服务,在接口调用时就会有跨域白名单拦截校验 跨域corshttps://github.com/expressjs/... var config = { cors: { //跨域请求 origin: [http://localhost:5000, http://localhost:5001],//也可以使用*代表允许...

    weij 评论0 收藏0

发表评论

0条评论

CoXie

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<