利用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. CodeForces - 965D Single-use Stones

    题面在这里! 如果你强行把问题建模,可以发现这是一个裸的增广路,又因为这是区间连边,所以跑一个 点数O(N)边数O(N log N)的线段树优化建边的网络流即可,不知道能不能过23333 但其实这个问 ...

  2. 【动态规划】【滚动数组】Educational Codeforces Round 26 D. Round Subset

    给你n个数,让你任选K个,使得它们乘起来以后结尾的0最多. 将每个数的因子2和因子5的数量求出来,记作a[i]和b[i]. 答案就是max{ min{Σa[i],Σb[i]} }(a[i],b[i]是 ...

  3. 【二分】Codeforces Round #417 (Div. 2) C. Sagheer and Nubian Market

    傻逼二分 #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; ll ...

  4. light oj 1151 - Snakes and Ladders 高斯消元+概率DP

    思路: 在没有梯子与蛇的时候很容易想到如下公式: dp[i]=1+(∑dp[i+j])/6 但是现在有梯子和蛇也是一样的,初始化p[i]=i; 当有梯子或蛇时转移为p[a]=b; 这样方程变为: dp ...

  5. Problem H: 零起点学算法109——单数变复数

    #include <stdio.h> #include<string.h> int main(void) { int n; ]; scanf("%d",&a ...

  6. Python的高级特性(切片,迭代,生成器,迭代器)

    掌握了python的数据类型,语句和函数,基本上就可以编出很多有用的程序了. 但是在python中,并不是代码越多越好,代码不是越复杂越好,而是越简单越好. 基于这个思想,就引申出python的一些高 ...

  7. Generator函数(二)

    for...of循环 1.for...of循环可以自动遍历Generator函数,不需要再调用next方法 function* helloWorldGenerator(){ yield 'hello' ...

  8. 防止xss攻击

    <?php function _removeXSS($val) { $search = 'abcdefghijklmnopqrstuvwxyz'; $search .= 'ABCDEFGHIJK ...

  9. 将json字符串转换成list<T>

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Se ...

  10. node.js中express-session配置项详解

    官方地址:https://www.npmjs.com/package/express-session 作用:用指定的参数创建一个session中间件,sesison数据不是保存在cookie中,仅仅s ...