在使用laravel时候 摒弃了自带的Auth和passport。主要原因是项目前后端分离,后端写api接口,另外email不做登录选项,password和用户信息存储分开存。在使用JWT过程中遇到很多的坑。
坑1
不能用JWTAuth静态调用
直接
public function xxx (JWTAuth $jwt){
$jwt->xxx;
这里的JWTAuth是
use Tymon\JWTAuth\JWTAuth;
感兴趣的可以看看 JWT.php 和JWTAuth.php这两个文件
坑2 token过期自动刷新
token有两个有效期,在config/jwt.php下面
'ttl' => env('JWT_TTL', 60),
'refresh_ttl' => env('JWT_REFRESH_TTL', 20160),
这假设用户登录,半个月内登录有效,那么这里的半个月是refresh_ttl,ttl是什么呢?ttl是单个签发的token有效期。
你半个月内可以有n个token,毕竟1个小时就过期,这时候过期不是真正过期,可以进行签发新token。
看了很多文档,大体上就写了个refresh token的接口
其实JWT在处理时候,如果token过期,你没有进行try catch处理,这里会报错的。而且前端没有获取到新token需要存储。
public function tokenValidator(&$request,$jwt){
#检测request中header头是否带了token
if(is_null($token = \request() ->header('authorization'))){
$this->response(400,'Authorization Failed,未携带Authorization');
#提取token中用户数据
$user = $jwt->parseToken()->toUser()->toArray();
if(! $user){
$this->response(200,'用户不存在','');
}catch (TokenExpiredException $exception){
#异常处理 token过有效期,进行刷新
$token = $jwt->refresh();
$access_token = 'Bearer'.$token;
$request->headers->set('Authorization',$access_token);
}catch(JWTException $exception){
#refresh 也过期,重新登录
$this->response(400,'Authorization过期,重新登录');
token如果过期,通过TokenExpiredException 可以catch到异常然后进行刷新token,刷新token又不能这时候response给前端,因为你用户登录有效期没过,这个接口得继续往下走,那么在request header头里加上这个token,后面接口使用时候就是新token,但是后面接口在返回时候又要带上新token给前端,让前端进行存储。
总觉得自己写的代码号low
Laravel(Lumen)中使用JWT-Auth遇到一个问题,即token如何刷新。
一开始不太理解作者的设计思想,看了很多issue之后,慢慢明白jwt-refresh如何使用。
建一个路由,比如“auth/refresh-token” ,可以指向某个方法,也可以直接写个匿名函数。
$app->post('auth/refresh-token', ['middleware
token刷新是前端安全中必要的一部分,本文从后端到前端整个流程介绍如何实现无感刷新token。页面代码亲自实现并跑通,请放心食用。如需源码,请在评论区留言。!!新建 config/constant.js/* localStorage存储字段 *///短token//长token、/* HTTP请求头字段 *///存放短token//存放长token新建 config/returnCodeMap.js// 在其它客户端被登录// 重新登陆// token过期//接口请求成功。
问题Laravel 会对所有的 POST 数据默认开启 CSRF 防护,实现的机制是检测 POST 数据里的 _token 信息。问题是:CSRF _token 的过期时间是多久?回答会在每一次 Session 创建时重新生成,也就是说,跟会话的时间一致,Laravel 默认为 120 分钟,可以通过修改 config/session.php 文件里的 lifetime 修改。来源...class...
嗨,我在前端使用角度js,在后端使用带有tymon jwt库的卫星和laravel.我正在使用jwt身份验证.我想在我的网络应用程序中记住我的功能.我看到’ttl’在laravel’config / jwt.php中设置令牌的到期时间./*|--------------------------------------------------------------------------| JWT...
需求:前后端分离状态下,登录失效(token过期)后,前端需要知道下一步是跳转到登录页面还是使用refresh_token刷新token。这就需要后端根据是否可以刷新token(refresh_token是否过期)返回不同的标识,以供前端进行下一步操作。具体做法如下:1、新建RefreshToken中间件,每次登陆成功后查询是否保存了token和id的对应关系(登录失效后无法通过token获取对应...
在使用laravel时候 摒弃了自带的Auth和passport。主要原因是项目前后端分离,后端写api接口,另外email不做登录选项,password和用户信息存储分开存。在使用JWT过程中遇到很多的坑。坑1 不能用JWTAuth静态调用直接public function xxx (JWTAuth $jwt){$jwt->xxx;}这里的JWTAuth是use Tymon\JWTAut...
token如何刷新在PHP框架Laravel中安装了扩展JWT-Auth,你可能会遇到一个问题,即token该如何刷新。可能很多人都不太理解作者的设计思想,包括我在内,但是看了很多issue之后,你就会慢慢的明白jwt-refresh是如何使用的咯,下面来给大家讲解一下。首先create一个路由,比如“auth/refresh-token” ,你可以指向某个方法,也可以直接写个匿名函数。这里个人是...
"message": "Token has expired",
"exception": "Tymon\\JWTAuth\\Exceptions\\TokenExpiredException",
"file": "D:\\Work\\Laravel\\SDUTdingding\\2_back-end\\vendor\\tymon\\jwt-
需求:前后端分离状态下,登录失效(token过期)后,前端需要知道下一步是跳转到登录页面还是使用refresh_token刷新token。
这就需要后端根据是否可以刷新token(refresh_token是否过期)返回不同的标识,以供前端进行下一步操作。
具体做法如下:
1、新建RefreshToken中间件,每次登陆成功后查询是否保存了token和id的对应关系(登录失效后无法...
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
define('TOKEN', 'yunlive11');
class WxresponseMsg extends Controller
protecte.
先说一下我的需求吧,我想要做一个多账号认证系统,也就是说一个用户可以以多中形态登录,但是很多人设计表的时候就一张,这样扩展很麻烦,比如同一个用户,用微信登录怎么办,比如说使用qq注册,所以我这里设计的是,有一个users表存储用户的主账号这里存储一些用户的基础信息,比如说性别,手机号(这个东西唯一来弄),然后我再设计一个account表,这个东西来存储用户的账户,账户可以多个,这样就形成了一对多的关系。针对关系表,要对account表进行认证系统。
1、jwt是什么。如果不知道会显得很low,所以要最起码知