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://
使用例 〜 データベースのスキーマなど
こんな感じ。ここで重要なのは、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>