at_yasu's blog

ロード的なことを

Laravel で OAuth ログインをやる

自作webサイトにて、TwitterやFacebookのアカウントでログインする機能を付ける方法


手っ取り早いのが one-auth を使う。けど、ドキュメントがちょっとわかりにくくて、結局はよく知らん人が Youtube にアップロードしたTutorial 動画 http://www.youtube.com/watch?v=xlUFiZhwFiE を見た。

インストール

インストールは簡単。トップディレクトリにて下記のコマンド

$ php artisan bundle:install oneauth
$ php artisan migrate


次に oneauth bundle を application/bundles.php へ使うと宣言。とりあえず初期状態から始めたらこんな感じになるはず。

<?php
return array(
    'docs' => array('handles' => 'docs'),
    'oneauth' => array('auto' => true),
);

使用例 〜サービスのID などを設定。

各サービス種設定をします。必要最低限でいい。

bundles/oneauth/config/api.php

<?php
return array(
		'facebook' => array(
			'id'     => '', // Application ID
			'secret' => '', // Secret
			'scope'  => 'email', // Scope, Email情報を取るとかそんなの
		),
		'twitter' => array(
			'key'    => '', // Consumer key
			'secret' => '', // Consumer Secret
		),
// ... その他もろもろ
);


callback などそこら辺のURLを設定

<?php

return array(
	'registration' => 'user/social_register',
	'login'        => 'user/social_login',
	'callback'     => 'connect/callback',
	
	'registered'   => '/',
	'logged_in'    => '/',
);

この場合だと、

1. 初期登録は http://localhost/index.php/user/social_register
2. ログインは http://localhost/index.php/user/social_login
3. 各サービスからリターンされてきた時に受け取るURL http://localhost/index.php/connect/callback

になりますよ。そんなわけで、Twitter などで使用する場合、Callback URL は http:///connect/callback にする必要あります。

使用例 〜 データベースのスキーマなど

こんな感じ。ここで重要なのは、provider_name, social_uid の2つが必須

CREATE TABLE `provider` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `provider_name` varchar(10) NOT NULL DEFAULT '',
  `social_uid` bigint(11) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `provider_social_uid_idx` (`social_uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

使用例 〜 ユーザ側を作成

application/routes.php に下記の一行を頭のほうに追加。意味はわかるよね…

<?php
Route::controller(Controller::detect());


魔法のコントローラファイルを作成。よくわからんけど、callbackの時に使うっぽい

application/controller/connect.php

<?php

class Connect_Controller extends OneAuth\Auth\Controller {}


リダイレクトされてきて、認証などが成功した時にする処理を書きますよっと。

application/controller/user.php

<?php

class User_Controller extends OneAuth\Auth\Controller {

    public function action_term () {
        return View::make("user.term");
    }

    public function action_social_login() {
        $user_data = Session::get('oneauth');

        // ユーザデータ取得
        $provider = Provider::where_provider_name($user_data['provider'])
            ->where_social_uid($user_data["info"]["uid"])->first();

        // 削除
        Session::forget('user_data');

        // ログインできたかで移動先変更
        if (!is_null($provider)) {
            Auth::login($provider->id, true);
            return Redirect::to('user/terms');
        }


        return Redirect::to('/');
    }

    public function action_social_register () {
        $user_data = Session::get("oneauth");

        // ユーザデータ取得
        $provider = Provider::where_provider_name($user_data['provider'])
            ->where_social_uid($user_data["info"]["uid"])->first();
        if (!is_null($provider)) {
            Auth::login($provider->id, true);
            return Redirect::to('user/terms');
        }

        $provider = new Provider;

        $provider->social_uid = $user_data["info"]["uid"];
        $provider->name = $user_data["provider"];

        // プロバイダー情報を保存
        $provider->save();

        Auth::login($provider->id, true);

        // 削除
        Session::forget('user_data');

        return Redirect::to('user/terms')->with( 'success', 'welcome! Thank you to join the slide :)');
    }
}


後はテンプレート

「Connect to Twitter」とかリンクはこんな感じのタグを埋め込んで

<div>{{ HTML::link('connect/session/twitter', 'Login with Twitter', array('class' => "btn")) }}</div>
<div>{{ HTML::link('connect/session/facebook', 'Login with Facebook', array('class' => "btn")) }}</div>

やればよし。

ログインの後は、 /user/term に飛ぶのでその簡単なテンプレを用意してやればヨロシ。

application/view/user/term.blade.php

<html>
<head><title>Welcome!</title></head>
<body>Welcome :)
</body>
</html>