2019独角兽企业重金招聘Python工程师标准>>>

作者好牛逼啊,我不懂的他全都懂。

Use Redis to revoke Tokens generated from jsonwebtoken


在前面一篇文章中,我讲述了怎么用 AngularJS 和 NodeJS 通过 jsonwebtoken 做用户验证。有人说,就算点了 logout 按钮, 你把 token 从 Angular 页面的 AuthenticationService 上移掉,你还是能用这个有效的 Token 来访问 API,直到 jsonwebtoken 判定它过期为止。

为了防止这种丑行,我决定用 Redis 数据库 来处理 token,当用户点了 logout 按钮的时候。Token 只会保存一段时间,就是你用 jsonwebtoken 登陆之后,token 有效的这段时间。之后,token 会被 redis 自动删掉。最后,我们创建一个 nodejs 的中间件,检查所有受限 endopoint 用的 token 是否存在 Redis 数据库中。

为 NodeJS 配置 Reids

首先我们要为 nodejs 安装 Redis 客户端库,并且配置我们的客户端链接到 Redis 实例。当 nodejs 应用启动的时候:

<!-- lang: js -->
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;

然后,我们来创建一个方法,用来检查提供的 token 是不是被注销了。

Token 管理和中间件

为了在 Redis 中保存 Token,我们要创建一个方法来拿到请求中的 Header 的 Token 参数,然后把它作为 Redis 的 key 保存起来。值是什么我们不管它。

<!-- lang: js -->
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;}
};

然后,再创建一个中间件来验证一下 token,当用户发起请求的时候:

<!-- lang: js -->
// 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 这个方法,是一个中间件,用来拿到请求头中的 token,然后在 Redis 里面查找它。如果 token 被发现了,我们就发 HTTP 401.否则我们就继续工作流,让请求访问 API。

我们要在用户点 logout 的时候,执行 expireToken 方法:

<!-- lang: js -->
exports.logout = function(req, res) {if (req.user) {tokenManager.expireToken(req.headers);delete req.user;return res.send(200);}else {return res.send(401);}
}

最后我们更新路由,用上新的中间件:

<!-- lang: js -->
//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);

好了,现在我们每次发送请求的时候,我们都去解析 token, 然后看看是不是有效的。

你可以从这里拿到源码

转载于:https://my.oschina.net/ilivebox/blog/281891

用 Redis 处理 jsonwebtoken 生成的 Token相关推荐

  1. java token生成和验证_Java Token登录验证 生成解析Token

    借鉴参考 Java Token登录验证 使用jjwt生成和解析JWT java基于token验证之登陆验证 等 什么是Token? 我的理解来说 token就是你访问服务器的口令,只要token合法, ...

  2. jjwt生成jwt token

    JJWT生成token jjwt 0.9.0版本 jjwt0.11.2版本 版本区别 第一个问题 第二个问题 第三个问题 最近在一个项目中不经意间升级了jjwt的版本(0.9.0升级到0.11.2), ...

  3. 如何添加JWT生成的token在请求头中

    前言 在我们使用JWT来做用户的验证时,我们登陆生成对应的token,并加入到请求的参数中发送到后台提供相关的权限校验.这个时候我们需要使用到传递请求头参数传递的问题,下面是两种方式. 1.ajax提 ...

  4. 任务37:生成 JWT Token

    实现给用户办法token 默认是可以访问valuesController的,返回的状态是200 http://localhost:5429/api/values 返回的状态码是200 把ValuesC ...

  5. nodeJS生成随机token

    md5加密实际用处不太大,在这里 1.直接代码 create_token(leng){leng = leng==undefined?32:leng //如果没设置token长度自动为32位//预设随机 ...

  6. 自定义ZuulFilter用于验证生成的token

    问题背景 微服务体系,一般都是把安全验证做再网关层面的.而一般zuul跟shiro或者spring security的集成会比较好. 但是,有时候公司的业务场景并不复杂,根本无需复杂的架构,那么手写一 ...

  7. Spring Boot 实现接口幂等性的 4 种方案!还有谁不会?

    点击关注公众号,Java干货及时送达 作者:超级小豆丁 链接:mydlq.club/article/94 一.什么是幂等性 幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,其作用在任一元素两 ...

  8. 亿级用户中心的设计与实践

    -     前言    - 用户中心是互联网最为基础的核心系统,随着业务和用户的增长,势必会带来不断的挑战.如何在亿级的情况下保证系统的高可用,高性能以及高安全,本文能够给你一套实践方案. 注1:本文 ...

  9. 面试题大全1-javaSE部分-JavaEE框架中间件

    文章目录 Java面试题大全 一.JavaSE 部分 基础部分 1.Java中基本数据类型有哪些? 2.Integer 和 int的区别 3.String和StringBuilder和StringBu ...

最新文章

  1. MinkowskiEngine基准测试
  2. 利用栈求表达式的值_高一数学月考考点之函数的表达式详解
  3. 如何把VS Code的Language Server Protocol整合到Eclipse中来
  4. Entity Framework Code First关系映射约定
  5. 数字图像处理实验(6):PROJECT 04-02,Fourier Spectrum and Average Value
  6. boost::histogram::axis::regular用法的测试程序
  7. swing 聊天气泡背景_Java Swing中的聊天气泡
  8. mockito环境配置_Mockito –使用全局配置的SmartNull在NPE上提供更好的错误消息
  9. flask-sqlAlchemy 创建表
  10. mybatis 使用in 查询时报错_为什么使用samtools检查bam质量时报错?
  11. python爬取今日热榜数据到txt文件
  12. java循环速度比较_List的二种循环速度比较
  13. linux终端无法输入大写字母,linux不能打大写字母
  14. 除了努力挣钱,青春也不能错过的十件事
  15. Windows 下网卡对802.1Q tag 的支持
  16. 获取设备的型号信息,比如iPhone5s,iPhone5等等
  17. Android 蓝牙连接,蓝牙配对,自动连接蓝牙
  18. 给计算机系学生的建议
  19. 学习ELMo从文本中提取特征的分步NLP指南
  20. 是用JDBC从数据库中获取数据并以java对象返回

热门文章

  1. 中心化,去中心化?关乎互联网未来命运的重要选
  2. 2018年全球十大新兴技术:细胞植入人体、营养人造肉……你想试试吗?
  3. 伯克利AI研究院解析「反向课程学习」,改善「强化学习智能体」并应用于机器人技术
  4. MIT与FAIR提出「mixup」,利用数据和标签的随机线性插值提高神经网络的健壮性
  5. 想做程序员却不知从何下手?新手入门信息打包送你!
  6. 97.16% 的加班率,给你 3 倍工资:你愿意去大厂吗?
  7. 使用scrapy抓取股票代码
  8. [BZOJ 3143][Hnoi2013]游走(高斯消元+期望)
  9. Shell命令-文件及内容处理之more、less
  10. ElasticSearch实战:Linux日志对接Kibana