November 30, 2014

Laravel SocialiteでFacebookとTwitterの認証をしてみた

Laravel 5は現在開発中です。正式リリース版では、当記事の内容と異なる可能性があります。

Laravel 5では、Laravel Socialiteを別途インストールすることで、Facebook,Twitter,Google,GitHub等と連携した認証(OAuth,OAuth2)を、簡単に実装できるようになります。
https://github.com/laravel/socialite

細かな書き方などは、以下がとても参考になりました。
https://laracasts.com/series/whats-new-in-laravel-5/episodes/9

以下、Facebookを用いた認証の簡単なサンプルです。

まず、予めFacebook側で適当にアプリを作成して、発行されたキーをプロジェクトルートの .env と config/services.php に設定しておきます。尚、.envはバージョン管理せずに、各環境でこっそりと作成するべきファイルです。

.env
FACEBOOK_CLIENT_ID=xxxxxxxxxx
FACEBOOK_CLIENT_SECRET=yyyyyyyyyy
config/services.php
// 以下を追記
'facebook' => [
    'client_id' => getenv('FACEBOOK_CLIENT_ID'),
    'client_secret' => getenv('FACEBOOK_CLIENT_SECRET'),
    'redirect' => url('facebook/callback'),
],
.envで設定した値はgetenv()で取得できます。CLIからの実行時でも取得できます。この機能は"PHP dotenv"を用いているので、同様のことは他のフレームワーク等でも簡単にできます。
https://github.com/vlucas/phpdotenv

Laravel Socialiteをインストールします。
$ composer require laravel/socialite:~2.0@dev
config/app.phpのprovidersにLaravel Socialiteのプロバイダを追記します。
'Laravel\Socialite\SocialiteServiceProvider',
routes.phpに、Facebook認証用のコントローラを追加します。以下、一例。
$router->controllers([
    'facebook' => 'FacebookController',
]);
app/Http/Controllers/FacebookController.php を作成します。
<?php namespace App\Http\Controllers;

use Laravel\Socialite\Contracts\Factory as Socialite;

class FacebookController extends Controller {

    /**
     * @var Socialite
     */
    protected $socialite;

    public function __construct(Socialite $socialite)
    {
        $this->socialite = $socialite;
    }

    public function getLogin()
    {
        return $this->socialite->driver('facebook')->redirect();
    }

    public function getCallback()
    {
        $user = $this->socialite->driver('facebook')->user();

        dd($user);
    }
}
以下の流れで、ユーザ情報が正しく表示されれば成功です。

* facebook/loginにアクセスしてFacebook側にリダイレクトされる。
* Facebook側で認証してfacebook/callbackにリダイレクトされる。
* ユーザ情報が表示される。

また、以下の形で、scopesの指定も出来ました。
return $this->socialite->driver('facebook')->scopes(['user_friends'])->redirect();
同じ流れで、Twitterの認証もうまくいきました。その他、GithubProviderやGoogleProviderも用意されているので、これらも同じような方法で上手くいくのかなと思います。
https://github.com/laravel/socialite/tree/master/src/Two

標準では用意されていないサービスでも、これらを参考にして簡単に自前できそうですね。

No comments:

Post a Comment