利用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产生的令牌的更多相关文章

  1. JSON Web Token 是什么?

    免费获得官方JWT手册并深入学习JWT吧! 简介 JSON Web Token(缩写JWT),是一套开放的标准(RFC 7519),它定义了一种紧凑且自URL安全的方式,以JSON对象的方式在各方之间 ...

  2. 如何在SpringBoot中集成JWT(JSON Web Token)鉴权

    这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token). 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具 ...

  3. JWT(JSON Web Token)

    摘要: 在Web应用中,使用JWT替代session并不是个好主意 适合JWT的使用场景 抱歉,当了回标题党.我并不否认JWT的价值,只是它经常被误用. 什么是JWT 根据维基百科的定义,JSON W ...

  4. 使用json web token

    由来 做了这么长时间的web开发,从JAVA EE中的jsf,spring,hibernate框架,到spring web MVC,到用php框架thinkPHP,到现在的nodejs,我自己的看法是 ...

  5. Json Web Token(JWT)

    Json web token (JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(Si ...

  6. JWT (JSON WEB Token)正确使用场景

    https://www.jianshu.com/p/af8360b83a9f 讲真,别再使用JWT了! ThoughtWorks中国 2017.08.16 08:51* 字数 2882 阅读 7154 ...

  7. 使用Json Web Token设计Passport系统

    >>Token Auth机制 基于Token的身份验证是无状态的,我们不将用户信息存在服务器或Session中. 相比原始的Cookie+Session方式,更适合分布式系统的用户认证,绕 ...

  8. [认证授权] 2.OAuth2(续) & JSON Web Token

    0. RFC6749还有哪些可以完善的? 0.1. 撤销Token 在上篇[认证授权] 1.OAuth2授权中介绍到了OAuth2可以帮我们解决第三方Client访问受保护资源的问题,但是只提供了如何 ...

  9. 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 ...

随机推荐

  1. 2017icpc 乌鲁木齐网络赛

    A .Banana Bananas are the favoured food of monkeys. In the forest, there is a Banana Company that pr ...

  2. [Codeforces-div.1 68D] Half-decay tree

    [Codeforces-div.1 68D] Half-decay tree 试题分析 增加显然是\(log\)的. 由于某一些叶子结点的答案是一样的,所以我们可以考虑一次性求解. 容易想到一个非常优 ...

  3. UVA 12338:Anti-Rhyme Pairs(后缀数组+ST表)

    [题目链接] click [题目大意] 给出一些字符串,询问查询任意两个字符串的最长公共前缀 [题解] 将字符串拼接,对拼接的字符串做后缀数组,对于查询的两个字符串, 只要在height数组上查询区间 ...

  4. 【贪心】【set】zoj3963 Heap Partition

    贪心地从前往后扫,每到一个元素,就查看之前的元素中小于等于其的最大的元素是否存在,如果存在,就将它置为其父亲.如果一个结点已经是两个儿子的父亲了,就不能在set中存在了,就将他删除.如果然后将当前元素 ...

  5. 【贪心】POJ1328-Radar Installation

    [思路] 以每一座岛屿为圆心,雷达范围为半径作圆,记录下与x轴的左右交点.如果与x轴没交点,则直接退出输出“-1”.以左交点为关键字进行排序,从左到右进行贪心.容易知道,离每一个雷达最远的那一座岛与雷 ...

  6. 操作系统介绍、python基础

    操作系统 什么是操作系统? 操作系统位于计算机硬件与应用软件之间,是一个协调.管理.控制计算机硬件资源与软件资源的控制程序.  2.为何要操作系统 ①  .控制硬件 ②  .把对硬件的复杂的操作封装成 ...

  7. Codeforces Beta Round #3 A. Shortest path of the king 水题

    A. Shortest path of the king 题目连接: http://www.codeforces.com/contest/3/problem/A Description The kin ...

  8. storm性能优化

    Storm 性能优化 目录 场景假设 调优步骤和方法 Storm 的部分特性 Storm 并行度 Storm 消息机制 Storm UI 解析 性能优化 场景假设 在介绍 Storm 的性能调优方法之 ...

  9. 班尼特·A·麦克道尔 - 一个交易者的资金管理系统(2013年5月26日)

    <一个交易者的资金管理系统:如何确保利润并避免破产风险> 作 者:班尼特·A·麦克道尔 系 列:“引领时代”金融投资系列-世界交易经典译丛 出 版:万卷出版公司 字 数:155千字 阅读完 ...

  10. C#开源框架整理

    Json.NET http://json.codeplex.com/ Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单.通过Li ...