2018/11/26更新

[Laravel] Token認証で利用するキー(api_token)の名前を変更する

このエントリーをはてなブックマークに追加      

こんにちは、@yoheiMuneです。
Laravelで、Ajax向けのAPIを作る場合に、トークン認証を使うことが個人的に多いのですが、Laravelのデフォルトのトークン認証をカスタマイズする機会があったので、それをブログに載せたいと思います。



目次




何がしたいのか

Laravelでは、以下のようにtokenを指定することで、トークン認証を使うことができます。
'guards' => [
    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],
],

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ]
],
この機能は便利で、よく利用しています。

Laravelは、認証に利用するtokenの値を、以下の優先順位で取得します(Laravel内の実装はこちら)。
  1. GETパラメータ
  2. POSTパラメータ
  3. AuthorizationヘッダーのBearer値
  4. PHP_AUTH_PWヘッダー
この際に、GET/POSTパラメータからの取得はapi_tokenというキー名で取得し、そのキーを変更するオプションはありません。それを変更したいというのが今回のブログです。



api_tokenキーを変更する

手順としては、カスタムガードを作成して、それを利用するという流れになります。


カスタムガードを作成する

まずは、カスタムガードを作成します。ここではapp/Services/Authフォルダの下にMyTokenGuard.phpを作成します(フォルダやファイル名は任意です)。
<?php
namespace App\Services\Auth;

use Illuminate\Auth\TokenGuard;
use Illuminate\Contracts\Auth\UserProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Log;

class MyTokenGuard extends TokenGuard {

    /**
     * Create a new authentication guard.
     *
     * @param  \Illuminate\Contracts\Auth\UserProvider  $provider
     * @param  \Illuminate\Http\Request  $request
     * @return void
     */
    public function __construct(UserProvider $provider, Request $request)
    {
        // 「api_token」から「api_key」にキーを変更する.
        // inputKey(1つ目のapi_key)が、GET/POSTパラメータから取得するキー.
        // storageKey(2つ目のapi_key)が、DBのカラム名.
        parent::__construct($provider, $request, 'api_key', 'api_key');
    }
}
上記のように、TokenGuardのインスタンスを作成する際に、inputKeystorageKeyを指定することで、任意のキーにすることができます。


カスタムガードをアプリに登録する

上記で作成したカスタムガードを、アプリ上で使えるように登録します。app/Providers/AuthServiceProvider.phpに追記します。
<?php

namespace App\Providers;

use App\Services\Auth\MyTokenGuard;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        // ★★★★★ 追加
        // my_token という名前で MyTokenGuard を使えるように登録.
        $this->app['auth']->extend('my_token', function($app, $name, array $config) {
            return new MyTokenGuard(Auth::createUserProvider($config['provider']), $app['request']);
        });
    }
}
上記の実装で、my_tokenが使えるようになりました。


my_tokenを用いて認証を実装する

最後にmy_tokenを利用します。app/config/auth.phpの認証設定を変更します。
'guards' => [
    'api' => [
        'driver' => 'my_token',   // ★★★★★ 変更:token → my_token に変更.
        'provider' => 'users',
    ],
],

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ]
],
これで、api_keyという名前で、GET/POSTパラメータから認証情報を取得できるようになりました。



最後に

別フレームワークからLaravelに移行する際に、APIの認証キーを変更したくないということで、今回の件を調べて実装しました。Laravelのコードをたくさん読みましたが、綺麗で読みやすくてとても勉強になったな〜という印象でした。フレームワークのコードを読むのはオススメです。

最後になりますが本ブログでは、PHP、フロントエンド、Python、サーバー、インフラ、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSTwitterをフォローして貰えたら嬉しいです ^ ^

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。