[Laravel] Token認証で利用するキー(api_token)の名前を変更する
こんにちは、@yoheiMuneです。
Laravelで、Ajax向けのAPIを作る場合に、トークン認証を使うことが個人的に多いのですが、Laravelのデフォルトのトークン認証をカスタマイズする機会があったので、それをブログに載せたいと思います。
Laravelは、認証に利用する
最後になりますが本ブログでは、PHP、フロントエンド、Python、サーバー、インフラ、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSやTwitterをフォローして貰えたら嬉しいです ^ ^
最後までご覧頂きましてありがとうございました!
Laravelで、Ajax向けのAPIを作る場合に、トークン認証を使うことが個人的に多いのですが、Laravelのデフォルトのトークン認証をカスタマイズする機会があったので、それをブログに載せたいと思います。
目次
何がしたいのか
Laravelでは、以下のようにtokenを指定することで、トークン認証を使うことができます。
'guards' => [
'api' => [
'driver' => 'token',
'provider' => 'users',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
]
],
この機能は便利で、よく利用しています。Laravelは、認証に利用する
tokenの値を、以下の優先順位で取得します(Laravel内の実装はこちら)。- GETパラメータ
- POSTパラメータ
- AuthorizationヘッダーのBearer値
- PHP_AUTH_PWヘッダー
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のインスタンスを作成する際に、inputKeyとstorageKeyを指定することで、任意のキーにすることができます。カスタムガードをアプリに登録する
上記で作成したカスタムガードを、アプリ上で使えるように登録します。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、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSやTwitterをフォローして貰えたら嬉しいです ^ ^
最後までご覧頂きましてありがとうございました!






