需求:前后端分离状态下,登录失效(token过期)后,前端需要知道下一步是跳转到登录页面还是使用refresh_token刷新token。

这就需要后端根据是否可以刷新token(refresh_token是否过期)返回不同的标识,以供前端进行下一步操作。

具体做法如下:

1、新建RefreshToken中间件,每次登陆成功后查询是否保存了token和id的对应关系(登录失效后无法通过token获取对应id)

<?php
namespace App\Http\Middleware;
use Closure;
use Auth;
use Illuminate\Support\Facades\DB;
class RefreshToken
{ /**
* @param $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$token=$request->header('authorization');
$has=DB::table('oauth_refresh_tokens_ids')->where('access_token',$token)->value('access_token_id');
if(!$has){
DB::table('oauth_refresh_tokens_ids')->insert(['access_token'=>$token,'access_token_id'=>Auth::user()->token()->id]);
}
return $next($request);
}
}

2、kerne.php文件内为RefreshToken中间件分配一个key

protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'refresh'=>\App\Http\Middleware\RefreshToken::class,//刷新token
];

3、在路由中使用RefreshToken中间件

4、重写Authenticate中间件登录失效后的跳转方法redirectTo

protected function redirectTo($request)
{ $token=$_SERVER['HTTP_AUTHORIZATION'];
$accessTokenId=DB::table('oauth_refresh_tokens_ids')->where('access_token',$token)->value('access_token_id');
$RefreshTokensExpiresAt=DB::table('oauth_refresh_tokens')->where('access_token_id',$accessTokenId)->value('expires_at');
if(strtotime($RefreshTokensExpiresAt)>strtotime(now())){
//可刷新token
return route('login',['code'=>402]);
}else{
return route('login',['code'=>401]);
}
}

5、新建路由

Route::get('login/{code}', function ($code) {
return response()->json(['code'=>$code,'msg'=>'login timeout.']);
})->name('login');

实现:

1、登录超时后refresh_token未过期时返回

{
"code": "402",
"msg": "login timeout."
}

2、登录超时后refresh_token过期时返回

{
"code": "401",
"msg": "login timeout."
}

说明:虽然数据表中存了token和refresh_token的创建时间和失效时间,但是框架验证的时候并没有从数据表中取值,而是直接通过token计算出来,不得不说安全性是真的高。所以通过修改token过期时间来进行登录状态续期的办法不可行,必须对token进行刷新。

Enjoy it !

  

最新文章

  1. iOS应用程序生命周期(前后台切换,应用的各种状态)详解
  2. 【leetcode】Unique Paths
  3. BZOJ2301 [HAOI2011]Problem b
  4. **php队列的实现思路和详细过程
  5. Javascript线程及定时机制
  6. DevExpress之列表控件
  7. unity 之2D游戏简单操作
  8. zookeeper_02:zookeeper基础
  9. FZU Problem 2221 RunningMan(贪心)
  10. 【渗透课程】第三篇-体验http协议的应用
  11. Kali Linux信息收集工具
  12. 电脑小知识-win10
  13. (网页)jQueryAJAXtimeout超时问题详解(转)
  14. boost--asio--读写大总结
  15. 【BZOJ2300】【SCOI2011】糖果
  16. SSM数据库数据导出excel
  17. ELK批量删除索引
  18. Spyder &amp; Python
  19. [BZOJ1500][NOI2005]维修数列 解题报告 Splay
  20. 原生态JDBC问题的总结

热门文章

  1. 我们是怎么实现Grpc CodeFirst
  2. Qt 的信号与槽(纯干货)
  3. Python-类的特性
  4. CSS3 - 新单位vw、vh、vmin、vmax使用详解
  5. HDU - 3791 建立二叉搜索树
  6. iOS 设备尺寸与系统信息
  7. 关于 IDEA 启动 springboot 项目异常 - Disconnected from the target VM, address: &#39;127.0.0.1:59770&#39;, transport: &#39;socket&#39;
  8. Python面向对象之异常处理
  9. markdown怎么上传图片
  10. 手动搭建I/O网络通信框架1:Socket和ServerSocket入门实战,实现单聊