oriceon/oauth-5-laravelを使ったLaravel 5のOAuth認証

# はじめに

Laravel5はLaravel4に比べて互換性がないと言ってもいいほど大部変わっています。

今回は試しに今まで使っていたartdarek/oauth-4-laravelのOAuthライブラリを使ってLaravel5にインストールしてみました。

と！その前に、先ほど話したようにLaravel5とLaravel4の互換性はないと言ってもいいほど大部違うので、そんな簡単にインストールできるはずはありません。まず、artdarek/oauth-4-laravelのissueを`Laravel 5`というキーワードで検索してどんな問題があったかを探ってみました。

![スクリーンショット 2015-02-16 午後0.55.01.png](https://qiita-image-store.s3.amazonaws.com/0/60849/7cc68322-d7f7-89ac-b738-3f3774c71eaa.png)

きたああ！！！やっぱりそういうissueがあります。海外では`L5`のことを`Laravel 5`と指しています。

では、さっそく一番目のissueの読んでみます。どうやら、oriceonさんがすでにoauth-5-laravel用のラリブラリーを作ったらしいので、さっそくそれを試してみます。（いまのところはこのレポはpull-request待ちですが、これをmergeしてしまうとおそらくLaravel 4の対応は消えてしまうのではないか)

# Composer update

oriceonさんが作ったLaravel 5に対応したOAuthのレポジトリですが、2015年２月11日に作ったものらしくて、出来立てのレポジトリです。

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

まず、このレポジトリはpackagistに登録されていないものなので、githubから取得するしかないんです。この際にcomposer.jsonはrequire以外にrepositoryを追加する必要があります。そして、masterブランチをcloneするので、バージョンはdev-masterになります。

```
	"require": {
		"laravel/framework": "5.0.*",
		"oriceon/oauth-5-laravel":"dev-master"
	},
	"repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/oriceon/oauth-5-laravel"
        }
    ],
```

次に、composerをアップデートします。

```
composer update
```

# app.phpにpackage登録

アップデートが完了したらartdarek/oauth-4-laravelと同じようにconfig/app.phpファイルを編集してpackageを登録します。

```
'providers' => array(
    // ...

    'Artdarek\OAuth\OAuthServiceProvider'
)
// ....

'aliases' => array(
    // ...

    'OAuth' => 'Artdarek\OAuth\Facade\OAuth',
)
```

# client_idとclient_secretの設定

Laravel 5では別のvendorコマンドを用意しました。まず、初期ファイルを生成してもらうので次のvendorコマンドを実行。

```
php artisan vendor:publish
```

そして、`config/oauth-5-laravel.php`に次のような初期設定ファイルが生成されます。

```
<?php
return [ 

    /*
    |--------------------------------------------------------------------------
    | oAuth Config
    |--------------------------------------------------------------------------
    */

    /**
     * Storage
     */
    'storage' => 'Session', 

    /**
     * Consumers
     */
    'consumers' => [

        /**
         * Facebook
         */
        'Facebook' => [
            'client_id'     => '',
            'client_secret' => '',
            'scope'         => [],
        ],      

    ]

];
```

どうでもいい話ですが、配列を`[]`で表現するのはとてもLaravel 5らしいです。

ここからはLaravel 5の醍醐味です。次のように設定しましょう。例ではGoogleを使うのでは、FacebookをGoogleに変更します。

```
<?php
return [ 

    /*
    |--------------------------------------------------------------------------
    | oAuth Config
    |--------------------------------------------------------------------------
    */

    /**
     * Storage
     */
    'storage' => 'Session', 

    /**
     * Consumers
     */
    'consumers' => [

        'Google' => array(
            'client_id'     => env('GOOGLE_CLIENT_ID'),
            'client_secret' => env('GOOGLE_CLIENT_SECRET'),
            'scope'         => ['userinfo_email', 'userinfo_profile'],
        ),		 

    ]

];
```

Laravel 5では環境変数で秘密情報を管理しています。そうすることによって、githubに秘密情報をプッシュしなくても、開発環境か、本番環境かによって使う秘密情報を自動的に管理してくれます。

そして、プロジェクトのルートの`.env`ファイルを開いてもらって、（もし.env.exampleになっている場合は.envにファイル名を変更してください）次の２行を増やしてくもらえます。ただし、`my_google_client_id`と`my_google_client_secret`を正しいものに変えてください。

```
GOOGLE_CLIENT_ID=my_google_client_id
GOOGLE_CLIENT_SECRET=my_google_client_secret
```

最後に、.envファイルをgithubにプッシュしないように、.gitignoreに.envを追加してください。

# 実行してみましょう

レポジトリに転がっているサンプルスニペットを試しました。

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

```
public function loginWithGoogle(Request $request)
{
    // get data from request
    $code = $request->get('code');

    // get google service
    $googleService = \OAuth::consumer('Google');

    // check if code is valid

    // if code is provided get user data and sign in
    if ( ! is_null($code))
    {
        // This was a callback request from google, get the token
        $token = $googleService->requestAccessToken($code);

        // Send a request with it
        $result = json_decode($googleService->request('https://www.googleapis.com/oauth2/v1/userinfo'), true);

        $message = 'Your unique Google user id is: ' . $result['id'] . ' and your name is ' . $result['name'];
        echo $message. "<br/>";

        //Var_dump
        //display whole array.
        dd($result);
    }
    // if not ask for permission first
    else
    {
        // get googleService authorization
        $url = $googleService->getAuthorizationUri();

        // return to google login url
        return redirect((string)$url);
    }
}
```

Laravel 5ではglobalのnamespaceをやめたので、OAuthクラスを使う際に必ず`\`を付けて使うことです。