从零实现Lumen-JWT扩展包(序):前因
转自:https://zhuanlan.zhihu.com/p/22531819?refer=lsxiao
最近这段时间我寻思着把几个月前爬下来的6万多首诗词曲文做成一个API,免费开放给大家用。
这么做的原因有三:
- 其一,是因为之前写过的古诗词文网由于有很多BUG,而且又在备案http://gushiciwen.com的域名,索性直接把网站下线,域名转回国内后,这段时间又忙,没时间弄阿里云的主机,闲置了快个多月了。
- 其二,是想给古诗词文网写一个Android版的开源示例的app,网站有了,但是我没有现成的REST API。
- 其三,是因为最近 taylorotwell 发布了Lumen5.3,从使用Laravel以来,还没试过Lumen,所以先顺便尝试下Lumen。
说写就写吧,前几天就开工了,用了的Dingo/api和tymondesigns/jwt-auth来做,不过过程中发现很多坑,而且这些坑大部分都需要自己去填,这样写下来,真的是很不爽。
我真的不是想贬低tymondesigns/jwt-auth,这是一个很好的扩展包,提高了效率。但是,真的很不好用,我不知道作者是不是真的用过这个库实现过一些API的Demo,我就随便举个栗子,比如说客户端请求并发的问题。
说这个问题前,先普及一些概念。
由于JWT推荐Token过期时效尽量不要太长,比如1至2小时都是可以的,那么为了尽量减轻客户端主动请求刷新Token的操作,可以在每次客户端发起需要验证Token的请求时,对旧Token进行刷新,新Token会以 Authorization: Bearer <token> 头的形式添加到HTTP响应头中,因为开启了黑名单,旧的Token会在刷新完成后,被加入黑名单,也就不能再次使用了。
当客户端请求并发的时候,问题就来了,请求的处理完成速度肯定会有先后,当前一个请求处理完成后,Token已经刷新了,后一个请求拿着一个已经被加入黑名单的Token问服务器要数据,此时请求只会被拒绝。
如下所示,并发请求:
用第三方包图的就是方便,结果还要去翻Issues,看看别人是怎么用的,着实恼火。
不过最新的1.0dev版本增加了JWT_BLACKLIST_GRACE_PERIOD配置,设置一个黑名单宽限时间,允许在遇到并发请求的时候,避免上述的情况,不过这个方案我认为不能根本上的解决并发的问题,而且我个人已经不想在花时间给未来可能带来的问题上了。
所以,你们也就知道我要干什么了,别人的轮子不好用,不顺手,只有自己撸轮子了。
这篇教程我会分为三个部分来写:
- 准备步骤,包括从如何设置命名空间,到创建ServiceProvider,以及如何让Lumen读取扩展包配置文件,简单测试是否能够读取配置等。
- 实现JWT,包括生成Token,校验Token,刷新Token,黑名单等,不过这部分我会根据自己的喜好进行设计。
- 为Lumen集成JWT用户认证功能。
- 发布扩展包到Packagist,让别人能够通过Composer轻松的把我们的扩展包集成到自己的项目中去。
第一部分的代码在我写这篇序的时候已经完成了。
最后每个部分的代码我都会以Tutorial-1、Tutorial-2、Tutorial-3、Tutorial-4、Tutorial-5分支的形式上传到Github中。
master分支会存放完成后的扩展包代码。
- 从零实现Lumen-JWT扩展包(序):前因
- 从零实现Lumen-JWT扩展包(一):基础构建
- 从零实现Lumen-JWT扩展包(二):JWT生成
- 从零实现Lumen-JWT扩展包(三):JWT解析
- 从零实现Lumen-JWT扩展包(四):用户认证
- 从零实现Lumen-JWT扩展包(五):发布扩展包
----------------------------------------------------------------
2016年9月23日 01:41:22
由于JWT实现篇幅太长,JWT实现拆分成:
----------------------------------------------------------------
2016年9月30日 08:28:22
这个系列已经完结了,不过我会增加一个编写artisan 来实现命令行生成秘钥的章节。
Github lsxiao/jwt-auth,点击前往。
从零实现Lumen-JWT扩展包(序):前因的更多相关文章
- 【转】下载量最高的 100 个 Laravel 扩展包推荐
说明 Laravel 另一个令人喜欢的地方,是拥有活跃的开发者社区,而活跃的开发者社区带来的,是繁华的扩展包生态. 本文对 Packagist 上打了 Laravel 标签 的扩展包进行整理,截止到现 ...
- R语言扩展包dplyr——数据清洗和整理
R语言扩展包dplyr——数据清洗和整理 标签: 数据R语言数据清洗数据整理 2015-01-22 18:04 7357人阅读 评论(0) 收藏 举报 分类: R Programming(11) ...
- 推荐 Laravel API 项目必须使用的 8 个扩展包
如今在现代网络开发中,比较流行的模式是基于 API 开发,可以通过手机或网站来创建服务. Laravel 是创建基于 API 的项目的最佳框架之一,它为世界各地的大型社区提供了高速开发. Larave ...
- Laravel 调试利器 —— Laravel Debugbar 扩展包安装及使用教程
1.简介 Laravel Debugbar 在 Laravel 5 中集成了 PHP Debug Bar ,用于显示调试及错误信息以方便开发.该扩展包包含了一个 ServiceProvider 用于注 ...
- R语言与医学统计图形-【28】ggplot2扩展包ggrepel、ggsci、gganimate、ggpubr
ggplot2绘图系统--扩展包ggrepel.ggsci.gganimate.ggpubr等 部分扩展包可在CRAN直接下载,有些需借助devtools包从Github下载. 1. ggrepel包 ...
- 如何正确使用 Composer 安装 Laravel 扩展包
我们经常要往现有的项目中添加扩展包,有时候因为文档的错误引导,如下图来自 这个文档 的: composer update 这个命令在我们现在的逻辑中,可能会对项目造成巨大伤害. 因为 composer ...
- Python之扩展包安装
读者朋友,在比较新的版本(Python 2 >=2.7.9 or Python 3 >=3.4)中,pip或者easy_install 扩展包命令已经默认安装(可查看 你的安装目录\p ...
- Visual Studio 2015的Web扩展包
过去几年,Visual Studio扩展功能生态系统得到了蓬勃发展,社区贡献出了大量优秀的扩展,其中也包括大量针对Web开发的扩展.但是很多时候,感觉寻找.安装.更新好 几个扩展,总显得比较麻烦.如果 ...
- 手动安装 atom 扩展包 packages
由于某些原因, 我们下载 atom 扩展时发现速度特别慢, 或者根本无法下载, 那我们可以尝试手动安装 首先, 从 github 上下载(或其它地方) 扩展包, 解压 进入该文件夹, 找到 packa ...
随机推荐
- Android开发者选项 介绍
15个必知的Android开发者选项 https://www.jianshu.com/p/07b551ee260b 1.Stay awake 充电时保持屏幕唤醒,开发的时候,时不时的锁屏真是够了,开 ...
- JS的scrollIntoView简单使用
scrollIntoView方法滚动当前元素,进入浏览器的可见区域 el.scrollIntoView(); // 等同于el.scrollIntoView(true) el.scrollIntoVi ...
- Android -- Camera.ShutterCallback
干货 相机拍照的回调 /** * Equivalent to takePicture(shutter, raw, null, jpeg). * * @see #takePicture(ShutterC ...
- POJ 1755 Triathlon 半平面交
看的这里:http://blog.csdn.net/non_cease/article/details/7820361 题意:铁人三项比赛,给出n个人进行每一项的速度vi, ui, wi; 对每个人 ...
- POJ 3525 Most Distant Point from the Sea 二分+半平面交
题目就是求多变形内部一点. 使得到任意边距离中的最小值最大. 那么我们想一下,可以发现其实求是看一个圆是否能放进这个多边形中. 那么我们就二分这个半径r,然后将多边形的每条边都往内退r距离. 求半平面 ...
- LINUX 查找tomcat日志关键词
#查询catalina.out日志文件中的关键词为2016-04-13 11:26:00的日志信息 grep -C 10 '2016-04-13 11:26:00' catalina.out |mor ...
- 【nodejs】FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
当使用大批量(>100)的SQL进行MySql数据库插值任务时,会发生以下错误: 总计将有371579条数据将被插入数据库 开始插入DB <--- Last few GCs ---> ...
- Android Studio:xxx is not an enclosing class 错误的解决方法
Android Studio:xxx is not an enclosing class 错误的解决方法 这个问题一般出现在内部类中,若要创建内部类的实例,需要有外部类的实例才行,或者是将内部类设置为 ...
- Mybatis拦截器实现SQL性能监控
Mybatis拦截器只能拦截四类对象,分别为:Executor.ParameterHandler.StatementHandler.ResultSetHandler,而SQL数据库的操作都是从Exec ...
- WPF编程:textbox控件文本框数据显示最后一行
WPF编程:textbox控件文本框数据显示最后一行 TextBox控件在接收大量数据的时候,滚动条一般在最上方,如何使滚动条随着数据的接收而向下滚动呢?比如有一个TextBox'控件txbRecvD ...