laravel jwt检查是不是携带token

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了laravel jwt检查是不是携带token相关的知识,希望对你有一定的参考价值。

参考技术A 携带的。
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点(SSO)场景。
JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

Laravel 7.0 - tymon/jwt-auth - 检查令牌是不是有效

【中文标题】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 jwt检查是不是携带token的主要内容,如果未能解决你的问题,请参考以下文章

JWT与Token详解

如何检查 JWT 令牌是不是在 Angular 8 中过期

Laravel 7.0 - tymon/jwt-auth - 检查令牌是不是有效

SpringCloud#gateway+jwt

如何检查给定值是不是是私有路由中的 JWT?

使以前的令牌无效并检查用户是不是有 JWT 令牌