Laravel Passportのクライアント認証を試してみる

Laravel Passportを使ってAPIからのアクセスにOAuth認証をかけたい。
一般に公開するものではなく、特定のクライアントからのアクセスのみを想定する。
そのため、ユーザデータは使用しない。

インストール

Laravel Passportをインストール。

1
$ composer require laravel/passport

Package Auto-Discovery に対応しているため、プロバイダに追加してやる作業は必要ない。

セットアップ

DBに必要なテーブルを作成する。

1
$ php artisan migrate

OAuth用に以下のテーブルが作成される。

  • oauth_access_tokens
  • oauth_auth_codes
  • oauth_clients
  • oauth_personal_access_clients
  • oauth_refresh_tokens

トークン作成時に使用されるキーを生成する。

1
$ php artisan passport:install

キーは、/storage/以下に生成される。
デフォルトでは.gitignoreで無視する設定となっているので注意。
また、公開リポジトリにアップしてはいけない。
対処法などは以下参考。

また、キーの生成とともに、DBにクライアントが作成される。

1
2
3
4
5
6
7
Encryption keys generated successfully.
Personal access client created successfully.
Client ID: 1
Client Secret: tR7FSAHLQ8qw1xIgEWMKQ26QK2nKUxHahSHvY3RW
Password grant client created successfully.
Client ID: 2
Client Secret: 6n4TGzdrJHYdEJwPoMsaYuCA9EaFpXiGFr4dMVc8

一つ目が、 Laravel Personal Access Client
二つ目が、Laravel Password Grant Client

二つ目はユーザ名+パスワードを利用したアクセストークンの発行に利用出来る。
(ユーザーとの紐付けは特に必要なし)
(必要なければ消しておいてもよい)

コードに追加

AuthServiceProvider.phpに追加

/app/Providers/AuthServiceProvider.php

1
2
3
4
5
6
public function boot()
{
    $this->registerPolicies();

    Passport::routes();
}

auth.phpのdriverをpassportに変更

/config/auth.php

1
2
3
4
5
6
7
8
9
10
11
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

クライアント認証情報グラントトークン

冒頭の趣旨を実現するために、マシン-マシン間の認証に最適、という認証方式を採用する。

Kanel.phpに追加

/app/Http/Kanel.php

1
2
3
4
protected $routeMiddleware = [
  ...
  'client' => CheckClientCredentials::class,
];    

アクセストークンの取得

以下にアクセスして取得出来る。

・リクエスト

1
POST : /oauth/token
項目 内容
grant_type client_credentials |
client_id 発行したクライアントのID(数字) |
client_secret 発行したクライアントのシークレット |
scope アクセスするスコープ |

・レスポンス

1
2
3
4
5
{
  "token_type": "Bearer",
  "expires_in": 31536000,
  "access_token": "YOUR-ACCESS-TOKEN-HERE"
}

発行されたトークンは、oauth_access_tokensテーブルに格納されていく。

有効期限

デフォルトではトークンの有効期限は1年間となっている。

変更するには、AuthServiceProviderbootメソッドから変更可能。

/app/Providers/AuthServiceProvider.php

1
2
3
4
5
6
7
8
public function boot()
{
    $this->registerPolicies();

    Passport::routes();
    Passport::tokensExpireIn(Carbon::now()->addMinute(60));
    Passport::refreshTokensExpireIn(Carbon::now()->addHour(2));
}

APIへのアクセス

上記トークンを使用してアクセス制限をかけたAPIへアクセスする。

ルートに追加

追加したミドルウェアを使用して、apiのルートにこの認証で使用するエンドポイントのリクエストを追加。

/routes/api.php

1
2
3
Route::get('/hoge', function (){
    return 'OK';
})->middleware('client');

アクセス

apiのルーティングは、/api以下に作成される。
よって、エンドポイントは以下になる

1
GET : /api/hoge

ヘッダにアクセストークンを付与してアクセスする。

  • Authorization : Bearer YOUR-ACCESS-TOKEN

エラー

アクセストークンが間違っているなどの場合は、InvalidArgumentExceptionが発生する。

参考

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