利用Redis撤销JSON Web Token产生的令牌
利用Redis撤销JSON Web Token产生的令牌
作者:chszs。版权全部。未经允许,不得转载。博主主页:http://blog.csdn.net/chszs
早先的博文讨论了在Angular.js和Node.js中使用jsonwebtoken实现认证授权的案例。这里要说明一下,当用户点击了“注销”button,用户的令牌在Angular端会从授权认证服务AuthenticationService中移除,可是此令牌仍旧是有效的,还能够被攻击者窃取到。用于API调用,直至jsonwebtoken的有效时间结束。
为了避免此情况的发生。能够使用Redis数据库来存储已撤销的令牌——当用户点击注销button时。且令牌在Redis存储的时间与令牌在jsonwebtoken中定义的有效时间同样。当有效时间到了后。令牌会自己主动被Redis删除。最后,创建Node.js应用来检查各终端上传的令牌在Redis中是否存在。
一、在Node.js中配置Redis
首先,必须在Node.js中安装Redisclient连接库。并配置client能够连接到Redis实例。
例如以下:
var redis = require('redis');
var redisClient = redis.createClient(6379);
redisClient.on('error', function (err) {
    console.log('Error ' + err);
});
redisClient.on('connect', function () {
    console.log('Redis is ready');
});
exports.redis = redis;
exports.redisClient = redisClient;
二、令牌管理器&中间件
要保存已移除的令牌。须要创建一个函数来获取Header的參数,并取出令牌,把它作为键名存储到Redis。至于键值就无所谓了。
var redisClient = require('./redis_database').redisClient;
var TOKEN_EXPIRATION = 60;
var TOKEN_EXPIRATION_SEC = TOKEN_EXPIRATION * 60;
exports.expireToken = function(headers) {
    var token = getToken(headers);
    if (token != null) {
        redisClient.set(token, { is_expired: true });
        redisClient.expire(token, TOKEN_EXPIRATION_SEC);
    }
};
var getToken = function(headers) {
    if (headers && headers.authorization) {
        var authorization = headers.authorization;
        var part = authorization.split(' ');
        if (part.length == 2) {
            var token = part[1];
            return part[1];
        }
        else {
            return null;
        }
    }
    else {
        return null;
    }
};
接下来。能够创建一个中间件来验证用户提供的令牌是否有效:
// Middleware for token verification
exports.verifyToken = function (req, res, next) {
    var token = getToken(req.headers);
    redisClient.get(token, function (err, reply) {
        if (err) {
            console.log(err);
            return res.send(500);
        }
        if (reply) {
            res.send(401);
        }
        else {
            next();
        }
    });
};
方法verifyToken是一个中间件,它从请求的Header部分取出令牌,并在Redis中进行查询。假设令牌发现了。则响应HTTP 401。
否则,继续处理,让用户訪问受限制的API。
当用户点击注销button时。平台端必须调用expireToken方法。
exports.logout = function(req, res) {
    if (req.user) {
        tokenManager.expireToken(req.headers);
        delete req.user;
        return res.send(200);
    }
    else {
        return res.send(401);
    }
}
最后,让之前开发的中间件模块生效:
//Login
app.post('/user/signin', routes.users.signin);
//Logout
app.get('/user/logout', jwt({secret: secret.secretToken}), routes.users.logout);
//Get all posts
app.get('/post/all', jwt({secret: secret.secretToken}), tokenManager.verifyToken, routes.posts.listAll);
//Create a new post
app.post('/post', jwt({secret: secret.secretToken}), tokenManager.verifyToken , routes.posts.create);
//Edit the post id
app.put('/post', jwt({secret: secret.secretToken}), tokenManager.verifyToken, routes.posts.update);
//Delete the post id
app.delete('/post/:id', jwt({secret: secret.secretToken}), tokenManager.verifyToken, routes.posts.delete);
如今,每次用户要请求受限的服务时,我们都须要解密其令牌,并检查令牌是否被撤销。
利用Redis撤销JSON Web Token产生的令牌的更多相关文章
- JSON Web Token 是什么?
		
免费获得官方JWT手册并深入学习JWT吧! 简介 JSON Web Token(缩写JWT),是一套开放的标准(RFC 7519),它定义了一种紧凑且自URL安全的方式,以JSON对象的方式在各方之间 ...
 - 如何在SpringBoot中集成JWT(JSON Web Token)鉴权
		
这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token). 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具 ...
 - JWT(JSON Web Token)
		
摘要: 在Web应用中,使用JWT替代session并不是个好主意 适合JWT的使用场景 抱歉,当了回标题党.我并不否认JWT的价值,只是它经常被误用. 什么是JWT 根据维基百科的定义,JSON W ...
 - 使用json web token
		
由来 做了这么长时间的web开发,从JAVA EE中的jsf,spring,hibernate框架,到spring web MVC,到用php框架thinkPHP,到现在的nodejs,我自己的看法是 ...
 - Json Web Token(JWT)
		
Json web token (JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(Si ...
 - JWT (JSON WEB Token)正确使用场景
		
https://www.jianshu.com/p/af8360b83a9f 讲真,别再使用JWT了! ThoughtWorks中国 2017.08.16 08:51* 字数 2882 阅读 7154 ...
 - 使用Json Web Token设计Passport系统
		
>>Token Auth机制 基于Token的身份验证是无状态的,我们不将用户信息存在服务器或Session中. 相比原始的Cookie+Session方式,更适合分布式系统的用户认证,绕 ...
 - [认证授权] 2.OAuth2(续) & JSON Web Token
		
0. RFC6749还有哪些可以完善的? 0.1. 撤销Token 在上篇[认证授权] 1.OAuth2授权中介绍到了OAuth2可以帮我们解决第三方Client访问受保护资源的问题,但是只提供了如何 ...
 - Java JWT: JSON Web Token
		
Java JWT: JSON Web Token for Java and Android JJWT aims to be the easiest to use and understand libr ...
 
随机推荐
- Flip Game II -- LeetCode
			
You are playing the following Flip Game with your friend: Given a string that contains only these tw ...
 - Luogu P3362 Cool loves shaxian 生成函数
			
题意: 定义f(i)=∑ k∣i k^d(i≤n),给出q个询问,每个询问询问区间[l,r]的f(i)的和. n<=1e7 d<=1e18 q<=5e4 可以发现f(i)是个积性函数 ...
 - ZOJ 2589 Circles(平面图欧拉公式)
			
[题目链接] http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2589 [题目大意] 给出一些圆,问这些圆可以把平面分为几个部 ...
 - Token-Pasting Operator (##) and Stringizing Operator (#)
			
Token-Pasting Operator (##)The double-number-sign or “token-pasting” operator (##), which is sometim ...
 - Android:布局实例之模仿QQ登录界面
			
预览图: 准备: 1.找到模仿对象 QQ登陆界面UI下载>>>>> 2.导入工程 3.查看布局结构和使用控件 其对应效果图分布为 4.分析样式选择器 下拉箭头2种样式:点 ...
 - Xcode8 报 ”xx“is missing from working copy 的问题解决方法
			
方法一: Xcode->Preferences->Source->Enable Source Control 勾勾去掉 方法二: Xcode8更新后,编译工程一下子报出800多条类似 ...
 - HDU 4417 Super Mario(划分树)
			
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
 - List of regional organizations by population
			
https://baike.baidu.com/item/国际组织/261053?fr=aladdin 经济文化类组织(非政府组织) 创行 狮子会 全球青年领导力联盟 乐施会 政治类组织 欧洲联盟(欧 ...
 - jQuery中的动画与效果
			
1.基本效果 匹配元素从左上角开始变浓变大或缩小到左上角变淡变小 ①隐藏元素 除了可以设置匹配元素的display:none外,可以用以下函数 hide(speed,[callback]) 返回值: ...
 - 初入android驱动开发之字符设备(一)
			
大学毕业,初入公司,招进去的是android驱动开发工程师的岗位,那时候刚进去,首先学到的就是如何搭建kernel.android的编译环境,然后就是了解如何刷设备以及一些最基本的工具.如adb.fa ...