Laravel5でJWT+Twitter OAuthの認証機能をつくる 1/3

認証機能のある、APIサーバーを作ろうとしたときにJWT（Json Web Token）という仕組みが使えそうだったので、
Laravel5で実装してみました。

Laravel5でJWT+Twitter OAuthの認証機能をつくる 1/3 ← いまここ
[Laravel5でJWT+Twitter OAuthの認証機能をつくる 2/3](http://qiita.com/foresta/items/cd75fa720f0fd275d084)
[Laravel5でJWT+Twitter OAuthの認証機能をつくる 3/3](http://qiita.com/foresta/items/e7baeb423d0a9bdd2efb)

#### その１ということでJWTを使う準備まで説明します。

## 使用するもの

Laravel5（Homestead）

jwt-auth
https://github.com/tymondesigns/jwt-auth

oauth-5-laravel
https://github.com/oriceon/oauth-5-laravel

# まずはLaravel5を動かす
まずはLaravel5が動く環境をさくっと作ります。

以前に書いた記事にLaravel5が動くまでの環境構築の手順を書いたのでよければ参考にしてください。
[HomesteadをつかってLaravel5を動かしてみる](http://qiita.com/foresta/items/799aaf7440c496f2379b)

無事Laravelが動いたら本題のjwt-authに入ります。

# jwt-authを使ってみる
https://github.com/tymondesigns/jwt-auth

##composerでインストール
requireにjwt-authを追加する

```composer.json

'require' {
     "tymon/jwt-auth": "0.5.*",
}
```
その後homestead ssh でログインして、composer updateでインストール

```
$ homestead ssh
$ composer update
```
#app.phpに追記

LaravelからJWTAuthが使えるように、設定ファイルに追記する

providersに末尾に以下のように追記します。

```php:app.php
providers [
     /*
      * JWTAuth
      */
     Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class
],
```

aliasesにも以下のように追記

```php:app.php
aliases [
     'JWTAuth'   => Tymon\JWTAuth\Facades\JWTAuth::class,
     'JWTFactory'=> Tymon\JWTAuth\Facades\JWTFactory::class
],
````

## 設定ファイル外だし

以下のコマンドを入力して、設定ファイルを/config配下に移す

```
$ php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"
```

実行すると、自分の環境だと config/jwt.php という設定ファイルができます。
通常はvendor配下に設定ファイルができるので、configに移しておくと便利です。

## Middlewareの追加

app/Http/Kernel.phpにMiddlewareの設定をします。

20行目をコメントアウト
21行目に```\App\Http\Middleware\EnableCors::class```を追加

※EnableCorsはクロスオリジンを許可するためのものなので、今回動かすだけならいらないと思います。

33, 34行目に以下を追加

```
'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class,
'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class
```
以下ファイル全体

````php:app/Http/Kernel.php
<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
//        \App\Http\Middleware\VerifyCsrfToken::class, // ここコメントアウト
        \App\Http\Middleware\EnableCors::class,        // ここ追加
    ];

    /**
     * The application's route middleware.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class, // ここ追加
        'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class   // ここ追加
    ];
}
```

## 秘密鍵の設定
Json Web Tokenの暗号、複合に用いる秘密鍵を生成し、設定します。
homestead ssh でログインした後に、以下コマンドで鍵生成

```
$ php artisan jwt:generate
```

## DB設定
usersテーブルはデフォルトで入っているものを使います。
後にテストするために仮データを入れます。

例のごとく homestead ssh でログインし、プロジェクトのあるディレクトリに移動しておきます
まずは、usersテーブルをマイグレート

```
$ php artisan migrate
```
これでデフォルトのusersテーブルができます。
次にartisan tinkerでユーザーの仮データを作成します
後、下記コマンドでphpのシェルに入ります。

```
$ php artisan tinker
```
シェルに入ったら以下のコマンドでユーザを作成します

```
$ App\User::create(['email'=>'jwt-test@example.com', 'name'=>'jet-test', 'password'=>bcrypt('password')]);
```
emailが"jwt-test@example.com"、passwordが”password"
のユーザーができます。

準備編ということで、とりあえずここまで。


# 次回
実際にコーディングをして、JWTの動作確認ができるところまでを書こうと思います。

## 参考にさせていただいたサイト様
https://github.com/tymondesigns/jwt-auth/wiki/Installation

http://arito-works.com/blog/laravel5%E3%81%A7json-web-tokenjwt%E3%82%92%E3%81%A4%E3%81%8B%E3%81%A3%E3%81%9F%E8%AA%8D%E8%A8%BC%E3%81%AB%E4%BE%BF%E5%88%A9%E3%81%AA%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AAjwt-auth%E3%82%92/

http://www.toptal.com/web/cookie-free-authentication-with-json-web-tokens-an-example-in-laravel-and-angularjs