Laravel令牌签名无法验证

ngp*_*und 2 php laravel laravel-5

我正在使用Laravel / Lumen作为Web应用程序后端的API,并且遇到了麻烦。

在一个示例中,我有一条不需要对用户进行身份验证的路由。但是我确实想检查路由控制器是否访问的用户具有有效令牌。

所以我写了以下内容:

    if ($tokenFetch = JWTAuth::parseToken()->authenticate()) {
        $token = str_replace("Bearer ", "", $request->header('Authorization'));
    } else {
        $token = '';
    }
Run Code Online (Sandbox Code Playgroud)

我相信上面将检查Bearer令牌是否有效,否则它将返回一个空白变量。

以下是我的整个控制器。

public function show($url, Request $request)
    {

        if ($tokenFetch = JWTAuth::parseToken()->authenticate()) {
            $token = str_replace("Bearer ", "", $request->header('Authorization'));
        } else {
            $token = 'book';
        }
        return response()->json(['token' => $token]);
    }
Run Code Online (Sandbox Code Playgroud)

问题

如果我通过了有效的令牌载体,它将返回令牌,但是如果我通过了无效的令牌载体,则会出现以下错误:

NamshiAdapter.php第62行中的TokenInvalidException:

无法验证令牌签名。

如果我完全不传递令牌:

JWTAuth.php第195行中的JWTException:

无法从请求中解析令牌

有没有一种方法可以检查令牌是否已传递,是否已经检查令牌是否有效,是否还没有传递令牌然后返回空白返回值?

Gal*_*Gal 5

您可以将其包装在try / catch块中

public function show($url, Request $request)
{
    try {
        $tokenFetch = JWTAuth::parseToken()->authenticate()) 
        $token = str_replace("Bearer ", "", $request->header('Authorization'));
    }catch(\Tymon\JWTAuth\Exceptions\JWTException $e){//general JWT exception
        $token = 'book';
    }
    return response()->json(['token' => $token]);
}
Run Code Online (Sandbox Code Playgroud)

您可能需要单独处理的异常很少(jwt-auth / Exceptions

同样,当您使用laravel 5时,可以全局处理JWT异常,在这种情况下不建议这样做,但是您应该了解此选项并选择自己。app/Exceptions/Handler.php和内部render方法添加[在顶部]

if ($e instanceof \Tymon\JWTAuth\Exceptions\JWTException) {
    //what happen when JWT exception occurs
}
Run Code Online (Sandbox Code Playgroud)