Laravel 7.0 - tymon/jwt-auth - 检查令牌是不是有效
Posted
技术标签:
【中文标题】Laravel 7.0 - tymon/jwt-auth - 检查令牌是不是有效【英文标题】:Laravel 7.0 - tymon/jwt-auth - check if token is validLaravel 7.0 - tymon/jwt-auth - 检查令牌是否有效 【发布时间】:2020-07-04 17:04:06 【问题描述】:尝试使用 tymon/jwt-auth (JWT) 在 laravel 安装中实现登录端点。登录,注销,获取用户数据工作正常。我想要一个端点来检查承载令牌。有一种简单的方法可以通过以下方式实现:
Route::get('/valid', function ()
return 1;
)->middleware('auth:api');
如果令牌有效,则 HTTP 返回码 == 200,否则返回 401 码。由于端点正在检查令牌而不是经过身份验证的通信,我宁愿让控制器返回关于有效令牌的真/假 200 - OK。
我查看了模块的“幕后”,这就是我能走多远(不工作):
$tokenKey = $request->bearerToken();
$jws = \Namshi\JOSE\JWS::load($tokenKey);
$jwsSimple = new SimpleJWS($jws->getHeader());
$jwsSimple::load($tokenKey);
$jwsSimple->setPayload($jws->getPayload());
$jwsSimple->setEncodedSignature(explode('.', $tokenKey)[2]);
$tmpVal = $jwsSimple->isValid($tokenKey);
有没有更好的方法来实现这一点?我认为应该有一个服务提供商,但无法弄清楚如何实现这一点。提前谢谢你。
【问题讨论】:
【参考方案1】:// 验证令牌控制器:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class ValidTokenController extends Controller
public function __invoke(Request $request)
$response = auth('api')->check();
$responseCode = 200;
if(!$response)
try
if (!app(\Tymon\JWTAuth\JWTAuth::class)->parseToken()->authenticate())
$response = 0;
catch (\Tymon\JWTAuth\Exceptions\TokenExpiredException $e)
$response = -1;
catch (\Tymon\JWTAuth\Exceptions\TokenInvalidException $e)
$response = -2;
catch (\Tymon\JWTAuth\Exceptions\JWTException $e)
$response = -3;
else
$response = (int) $response;
return response()->json($response, $responseCode);
【讨论】:
【参考方案2】:这是使用 laravel 和 tymon/jwt-auth 实现基于状态的令牌验证的混合输出:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class ValidTokenController extends Controller
public function __invoke(Request $request)
$response = (int) auth('api')->check();
$responseCode = 200;
try
if (!app(\Tymon\JWTAuth\JWTAuth::class)->parseToken()->authenticate())
$response = 0;
catch (\Tymon\JWTAuth\Exceptions\TokenExpiredException $e)
$response = -1;
catch (\Tymon\JWTAuth\Exceptions\TokenInvalidException $e)
$response = -2;
catch (\Tymon\JWTAuth\Exceptions\JWTException $e)
$response = -3;
return response()->json($response, $responseCode);
【讨论】:
【参考方案3】:你可以删除 auth:api
中间件,然后有类似的东西:
return response()->json([ 'valid' => auth()->check() ]);
【讨论】:
【参考方案4】:也许这个方法需要你:
public function getAuthenticatedUser()
try
if (! $user = JWTAuth::parseToken()->authenticate())
return response()->json(['user_not_found'], 404);
catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $e)
return response()->json(['token_expired'], $e->getStatusCode());
catch (Tymon\JWTAuth\Exceptions\TokenInvalidException $e)
return response()->json(['token_invalid'], $e->getStatusCode());
catch (Tymon\JWTAuth\Exceptions\JWTException $e)
return response()->json(['token_absent'], $e->getStatusCode());
return response()->json(compact('user'));
【讨论】:
不得不像这样调整你的代码:if (!app(\Tymon\JWTAuth\JWTAuth::class)->parseToken()->authenticate()) 和异常绝对命名空间定义。在那之后,它就像一个魅力。将在下面发布最终解决方案。谢谢四位的帮助!以上是关于Laravel 7.0 - tymon/jwt-auth - 检查令牌是不是有效的主要内容,如果未能解决你的问题,请参考以下文章
PHP 7.0 上的 Laravel 5.4:PDO 异常 - 找不到驱动程序 (MySQL)
SQLSTATE[HY000]:一般错误:1215 无法添加外键约束 [Laravel 7.0]
ovh/ovh 需要 guzzlehttp^6.0 而 therobfonz/laravel-mandrill-driver 需要 guzzlehttp^7.0:有啥解决方案吗?