【问题标题】:How to get Bearer token from a request in Laravel如何从 Laravel 的请求中获取 Bearer 令牌
【发布时间】:2018-04-19 21:21:10
【问题描述】:

我期待来自所有传入请求的 JWT 令牌,它应该包含在请求标头中,例如:Authorization => 'Bearer: some token here'

我想得到这个令牌并验证它:这是我正在尝试的:

$token = $request->header('Authorization');

这就是我得到的:

"Authorization: Bearer: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJleGFtcGxlLm9yZyIsImF1ZCI6ImV4YW1wbGUuY29tIiwiaWF0IjoxMzU2OTk5NTI0LCJuYmYiOjEzNTcwMDAwMDB9.UQUJV7KmNWPiwiVFAqr4Kx6O6yd69lfbtyWF8qa8iMN2dpZZ1t6xaF8HUmY46y9pZN76f5UMGA0p_CMqymRdYfNiKsiTd2V_3Qpt9LObaLg6rq18j3GLHfdr8nyBzO3v7gTpmNaU6Xy47aMDsbcs593Lx_lD3PnO41oEHgih7CsRKW1WcW1radnpEhdDO7-GpmGOF6xUnpAlQ9EHqpqnIlZPbVoJg92Iwozn-07uuWrkyKUpYN4IPpstd1ks3cKlJ6FH-2ROiC4N0MVLxp4lhUyKhLdwgDWYH4tjtdrEVK0a3_zVtK1ukvriEJqMkfYHnE6Bwv_pv_-lRNy_y7m-YQ"

问题有没有办法只获取不包括"Authorization: Bearer"的令牌 当然我可以解析整个字符串并获取令牌,但我只是想知道是否有另一种方法可以在不解析的情况下获取它。

【问题讨论】:

  • Laravel 没有内置的方法来为你获取这个,但是如果你不想自己解析字符串,你可以使用很多包(当然如果你使用包这不是因为您不想解析字符串,而是因为它还具有您需要的其他功能。
  • @MatthewDaly 不,我没有使用该软件包,因为由于某些原因我无法使其与 rs256 加密一起使用。我正在使用 firebase 使用公钥/私钥对令牌进行签名和验证

标签: php laravel jwt


【解决方案1】:

Illuminate\Http\Request 对象上有一个 bearerToken() 方法,因此您应该能够执行 $token = $request->bearerToken(); 并返回您期望的结果(这是在 Laravel 5.5 中 - 我不确定以前的版本)。

【讨论】:

  • 如果它真的存在那就太棒了
  • 确实存在。 Request Bearer Token
  • 我也验证过了,bearerToken() 方法在 Laravel 5.2 版本中可用
  • 有人关心如何在 PHPUnit 测试中设置不记名令牌吗?对于那些对 PHUnit 测试方法感兴趣的人,请添加以下内容:$actual = $this->call('GET', '/the-api-uri', [], [], [], ['HTTP_Authorization' => 'Bearer ' . $token]); 在 MarkRedeman 的回答中查看更多解释 here
  • 从 Laravel 8 开始,该方法存在,并且有效
【解决方案2】:

为了在 API 调用中从 Header 中获取 Bearer 令牌,我使用了以下方法。 它在 Laravel 6.6.0 中为我工作

$token= request()->bearerToken();

希望这对你有用。

在 Laravel 6.6.0 中使用

注意:如果 BearerToken 没有显示,那么请交叉检查 BearerToken 是否在 header 中可用..

$header = $this->header('Authorization', '');        
if (Str::startsWith($header, 'Bearer ')) 
{            
     return Str::substr($header, 7);        
}

【讨论】:

  • 请检查您是否已添加 use Illuminate\Http\Request; 它在 Laravel 6.6.0 @QumberRizvi 中工作正常
  • 对我来说,这是在本地工作,但不在生产环境中,不知道为什么,$request->bearerToken() 为空,实际上是整个 Authorization 标头。有什么想法吗?
  • 请检查 use Illuminate\Http\Request 是否使用以及 laravel 版本。如果有任何问题,请发送您的代码。 @马科斯
  • 即使我在请求中看到它,我也得到了空的不记名...
  • 您也可以使用 $header = $this->header('Authorization', ''); if (Str::startsWith($header, 'Bearer ')) { return Str::substr($header, 7); } 进行交叉检查,如果 Header 响应包含授权数据。
【解决方案3】:

方法bearerToken() 在 Laravel 5.2 中引入。您可以使用: $token = $request->bearerToken(); 获取令牌。如果您打算从标头中获取令牌,并将文本从“Bearer”更改为其他内容,您可以定义自己的函数,如下所示:

  public function bearerToken()
  {
       $header = $this->header('Authorization', '');
       if (Str::startsWith($header, 'Bearer ')) {
           return Str::substr($header, 7);
       }
  }

【讨论】:

    【解决方案4】:

    你可以这样做:

    $response = explode(':', $request->header('Authorization'));
    $token = trim($response[2]);
    

    【讨论】:

    • trim(explode(':', $header)[1])
    【解决方案5】:

    如果你使用 auth:api 不需要设置保护名称 'api'

    \Auth::guard('api')->getTokenForRequest();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多