无法验证Laravel令牌签名


Laravel Token Signature could not be verified

我正在使用Laravel/Lumen作为web应用程序后端的API,并且遇到了一个小问题。

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

所以我写了以下内容:

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

我相信上面的代码将检查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]);
    }

如果我传入一个有效的令牌承载,它返回令牌,但是如果我传入一个无效的令牌,我得到以下错误:

NamshiAdapter.php第62行TokenInvalidException:

令牌签名无法验证。

如果我根本不传递token:

JWTAuth.php第195行:

无法从请求中解析令牌

是否有一种方法来检查一个令牌是否被传递,如果它有,然后检查它是否有效,但如果一个没有被传递,然后返回一个空白返回?

你可以把它包装在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]);
}

有一些异常可能需要单独处理(jwt-auth/exceptions)

同样,当你使用laravel 5时,你可以全局处理JWT异常,在这种情况下不推荐,但你应该知道这个选项并自己选择。app/Exceptions/Handler.php和内部render方法add [at top]

if ($e instanceof 'Tymon'JWTAuth'Exceptions'JWTException) {
    //what happen when JWT exception occurs
}

是的,实现你想要的是可能的。

检查是否有令牌传递:

如果你查看parseToken的文档,你会看到检查是否传递token的算法是:

if (! $token = $this->parseAuthHeader($header, $method)) {
    if (! $token = $this->request->query($query, false)) {
    }
}

// which it will be in your case:
$hasToken = true;
$header = $request->headers->get('authorization');
if (! starts_with(strtolower('authorization'), 'bearer')) {
    if (! $request->query('token', false)) {
        $hasToken = false;
    }
}

检查令牌是否有效:

请注意NamshiAdapter使用Namshi'JOSE包,所以请阅读这里的文档。

在NamshiAdapter.php中,你可以看到引起错误的行是:

if (! $jws->verify($this->secret, $this->algo)) {
    throw new TokenInvalidException('Token Signature could not be verified.');
}
// in your case:
// + try to var_dump $this->secret, $this->algo
// + use Namshi'JOSE'JWS
// if you var_dump
$jsw = new JWS(['typ' => 'JWT', 'alg' => $algo]);
$jws = $this->jws->load($token, false);
// if you want to follow the documentation of Namshi'JOSE
$jws = JWS::load($tokenString, false, $encoder, 'SecLib');
// again var_dump for $this->secret, $this->algo
$isValidToken = ($jws->verify($this->secret, $this->algo));