Laravel5.6 PassportでAPI認証を実装

d yoshikawa
Crunchtimer
Published in
6 min readMay 2, 2018

LaravelをSPAやスマホアプリのバックエンドとして使いたい時はAPIを実装することになります。
ログイン機能付きシステムの場合はAPIで認証する必要も出てきます。

LaravelにはAPI認証を実装するためのPassportというパッケージが公式で用意されています。

https://readouble.com/laravel/5.6/ja/passport.html

これを使ったごくシンプルなデモをやってみたのですが、やや詰まったので記事にしておきます。

公式ドキュメント以外では以下の記事を参考にしました。

https://blog.hinaloe.net/2016/09/15/try-passport-laravel-5-3/

http://www.dn-web64.com/archives/web/laravel_passport/

デモ手順

Laravelプロジェクトの環境構築は割愛します。
まず、ログイン機能を生成します。

php artisan make:auth

Passportを導入します。

composer require laravel/passport

自動的にPassport用のマイグレーションファイルが追加されるので、マイグレートします。

php artisan migrate

作成したテーブルにプリセット設定を注入します。

php artisan passport:install

ここでClient IDとClient Secretが表示されるのでClient ID=2のSecretを控えておいて下さい。
後で使用します。

app/User.phpを次のように書き換えます。

use Laravel\Passport\HasApiTokens; // use Illuminate\Support\Facades\Gate;の行の前に追加
use HasApiTokens, Notifiable; // use Notifiable;の行を置換

app/Providers/AuthServiceProvider.phpを次のように書き換えます。

use Laravel\Passport\Passport; // use Illuminate\Support\Facades\Gate;の行の上に追加
Passport::routes(); // $this->registerPolicies();の行の下に追加

config/Auth.phpを次のように書き換えます。

'driver' => 'passport' // 'driver' => 'token'の行を置換

デモ用のユーザを登録します。
ブラウザで/registerページにアクセスします。

各項目を埋めて登録します。
上の例ではパスワードは”password”としました。

以上でLaravelのセットアップは完了しました。
実際にAPIを叩いてみます。
APIの試験にはChrome拡張のRestet Clientを使用しました。

Passportにはgrantと呼ばれる認証方式がいくつか用意されているのですが、今回はメールアドレスとパスワードで認証するgrantを使います。

/oauth/tokenにPOSTリクエストするとアクセストークンを取得できるようになっています。
リクエストヘッダーにContent-Type: application/jsonを付与し、JSONは以下の形式で渡します。

{
"grant_type": "password",
"client_id": 2,
"client_secret": <Secret>,
"username": <メールアドレス>,
"password": <パスワード>,
"scope": "*"
}

client_secretは先ほど控えたものを貼り付けます。
grant_typeはpassword、client_idは2として下さい。

こんな感じで渡すと、

レスポンスでアクセストークンが得られます。
このアクセストークンを使い、/api/userを叩いてみます。

/api/userには正しいトークンが渡されているかをチェックするバリデーションがかけられています。

リクエストヘッダーにAccept: application/jsonとAuthorization: Bearer <アクセストークン>を付与してGETリクエストを行います。

これで叩くと、

ユーザ情報が得られました。

今度はアクセストークンをわざと変えてリクエストしてみます。

頭2文字を消してみました。
これで/api/userを叩くと、もちろん正しくないアクセストークンなので、

認証で弾いてくれます。

以上がPassportのデモとなります。

次はGoogleログインやTwitterログインを可能にするSocialiteも試してみたいと思います。

--

--