Laravel Passport token过期后判断refresh_token是否过期
需求:前后端分离状态下,登录失效(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 !
Laravel Passport token过期后判断refresh_token是否过期的更多相关文章
- laravel passport加密jwt格式的access_token中的sub(user_id)字段
在很多需求我们不希望别人知道用户在我们表中的 user_id :但是又想用数据库的自增 id 功能:一般时候在取出用户后加密 user_id 加密即可:但是总有那么几个不经意间就可能把我们的 user ...
- laravel Passport - 创建 REST API 用户认证以及Dingo/Api v2.0+Passport实现api认证
第一部分: 安装passport 使⽤ Composer 依赖包管理器安装 Passport : composer require laravel/passport 接下来,将 Passport 的服 ...
- Laravel Passport认证-多表、多字段解决方案
Laravel Passport认证-多表.多字段解决方案 2018年08月19日 09:31:01 醉卧码场君莫笑 阅读数:1632 1. 概述 API 通常使用令牌(token)进行认证并且在 ...
- laravel Passport - Dingo/Api v2.0+Passport 实现 api 认证
第一部分: 安装passport 使⽤ Composer 依赖包管理器安装 Passport : composer require laravel/passport 接下来,将 Passport 的服 ...
- Laravel Passport API 认证使用小结
Laravel Passport API 认证使用小结 八月 4, 2017 发布在 Laravel 看到Laravel-China 社区常有人问 Laravel Passport 用于密码验证方式来 ...
- MVC 访问IFrame页面Session过期后跳转到登录页面
Web端开发时,用户登录后往往会通过Session来保存用户信息,Session存放在服务器,当用户长时间不操作的时候,我们会希望服务器保存的Session过期,这个时候,因为Session中的用户信 ...
- 授权过期后AJAX操作跳转到登录页的一种全局处理方式
前两天园友JustRun分享了一篇 <菜鸟程序员之Asp.net MVC Session过期异常的处理>博文,正好自己前段时间被安排处理过这个问题,发现JustRun的方法有一点点可优化的 ...
- 关于k8s集群证书1年过期后,使用kubadm重新生成证书及kubeconfig配置文件的变化
这个证书很重要,不用说. 但手工生成证书,确实工作量大且容易出错. 推荐的方式,是保留/etc/kubernetes/pki目录下的ca.crt,ca.key,sa.crt,sa.key. 这四个文件 ...
- laravel passport client_credentials
我是使用 Laravel 5.4 + Dingo Api + passport/jwt 两个验证方式 目前需要用到 passport 的 client_credentials 获取 token成功之后 ...
随机推荐
- BFC是什么?BFC有什么用?看完全明白
一.BFC是什么? 官方定义 BFC(Block Formatting Context,块格式化上下文) 是Web页面的可视化CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交 ...
- Python中的数值类型总结
本文参考书:<Learning Python>中文版--<Python 学习手册>第四版 Python中包含大量的数值类型,他们中的大部分与其他编程语言保持一致,因此学习他们就 ...
- 使用sstream进行int转换string的注意事项
个人网站 :http://39.106.25.239/ 1.引入sstream文件 2.使用stringstream 声明 3.使用一次sstream转换后要执行成员函数.clear() 来清除str ...
- Go语言库系列之dotsql
导读:能单独拎出SQL文件的某一行或几行执行,是不是非常有趣?今天我们来介绍一下这个有意思的库--dotsql. 背景介绍 dotsql不是ORM,也不是SQL查询语句的构建器,而是可以在一个SQL文 ...
- MATLAB GUI设计(3)
一.gca.gcf.gco 1.三者的功能定义: gcf 返回当前Figure 对象的句柄值 gca 返回当前axes 对象的句柄值 gco 返回当前鼠标单击的句柄值,该对象可以是除root 对象外的 ...
- 悟懂MapReduce,不纠结!
在<谷歌 MapReduce 初探>中,我们通过统计词频的 WordCount 经典案例,对 Google 推出的 MapReduce 编程模型有了一个认识,但是那种认识,还只是停留在知道 ...
- STM32F103ZET6 PWM输出
1.通用定时器的PWM功能 STM32F103ZET6有4个通用定时器,分别是TIM2.TIM3.TIM4.TIM5. 通用定时器由一个可编程预分频器驱动的16位自动装载计数器构成. 通用定时器的很多 ...
- 《Three.js 入门指南》3.1.1 - 基本几何形状 -圆环面(TorusGeometry)
3.1 基本几何形状 圆环面(TorusGeometry) 构造函数 THREE.TorusGeometry(radius, tube, radialSegments, tubularSegments ...
- .NET Core项目部署到Linux(Centos7)(十)总结
目录 1.前言 2.环境和软件的准备 3.创建.NET Core API项目 4.VMware Workstation虚拟机及Centos 7安装 5.Centos 7安装.NET Core环境 6. ...
- web font各浏览器兼容问题以及格式
语法: @font-face { font-family: <identifier>; src: <fontsrc> [, <fontsrc>]*; <fon ...