tymon/jwt-authにパーサーを追加する

PHPLaravel

Authorization: Token {token}の形式でトークンを取得するためにやったことのメモ。

TL;DR

  • Tymon\JWTAuth\Contracts\Http\Parserを実装したクラスを作成する

    • 今回の場合だとTymon\JWTAuth\Http\Parser\AuthHeadersを使ってもよかった
  • Tymon\JWTAuth\JWTAuthに作成したクラスをサービスプロバイダー経由で追加する

解決方法

AuthHeaderssetHeaderNamesetHeaderPrefixというメソッドが定義されていてトークンの取得形式を変更することができるので、サービスプロバイダーでインスタンスを生成してパーサーへ追加することで解決できた。

vendor/tymon/jwt-auth/src/Http/Parser/AuthHeaders.php
class AuthHeaders implements ParserContract
{
    protected $header = 'authorization';

    protected $prefix = 'bearer';

    // 一部省略

    public function parse(Request $request)
    {
        $header = $request->headers->get($this->header) ?: $this->fromAltHeaders($request);

        if ($header && preg_match('/'.$this->prefix.'\s*(\S+)\b/i', $header, $matches)) {
            return $matches[1];
        }
    }

    public function setHeaderName($headerName)
    {
        $this->header = $headerName;

        return $this;
    }

    public function setHeaderPrefix($headerPrefix)
    {
        $this->prefix = $headerPrefix;

        return $this;
    }
}

例としてAppServiceProviderに追加しているが、別途サービスプロバイダーを作成して追加しても良いと思う。

app/Providers/AppServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        //
    }

    public function boot()
    {
        $this->addJwtTokenParser();
    }

    private function addJwtTokenParser()
    {
        $jwtAuth = $this->app->make(JWTAuth::class);
        assert($jwtAuth instanceof JWTAuth);

        $parser = (new AuthHeaders())->setHeaderPrefix('token');
        $jwtAuth->parser()->setChain(array_merge(
            $jwtAuth->parser()->getChain(),
            [$parser]
        ));
    }
}

参考