无法验证Laravel令牌签名

时间:2015-09-30 17:38:02

标签: php laravel laravel-5

我使用Laravel / Lumen作为webapp后端的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:

     

无法验证令牌签名。

如果我根本不传递令牌:

  

JWTAuth.php第195行中的JWTException:

     

无法从请求中解析令牌

有没有办法检查一个令牌是否被传递,如果有,那么检查它是否有效,但是如果还没有传递,那么返回一个空白的回复?

2 个答案:

答案 0 :(得分:4)

您可以将其包装在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.phprender内部方法添加[在顶部]

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

答案 1 :(得分:0)

是的,有可能达到你想要的效果。

检查是否传递了令牌:

如果您查看parseToken的文档,您会看到检查我们是否传递令牌的算法是:

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包,因此请阅读文档here

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));