Laravelでツイッターのアプリケーションを作るメモ
使用するライブラリはthujohn/twitter
基本的にはExamples通りに実装すればOAuth認証を行うことが出来るのですが、新しめのバージョンのLaravelだと一部詰まる部分がありました。
ライブラリの追加
thujohn/twitterはcomposerで追加します。
composer require thujohn/twitter
を実行
ライブラリの追加後は/config/app.phpのprovidersとaliasesに以下を追加します。
'providers' => [ 'Thujohn\Twitter\TwitterServiceProvider', ]
'aliases' => [ 'Twitter' => 'Thujohn\Twitter\Facades\Twitter', ]
CONSUMER_KEYの設定
php artisan vendor:publish
でconfigフォルダー内にttwitter.phpが追加されます。
このファイル内にコンシューマーキーなどを追加するのですが.envファイルから読み込むようにするのがいいでしょう。
.envファイルから読み込ませる場合は.envファイルに
TWITTER_CONSUMER_KEY = コンシューマーキー TWITTER_CONSUMER_SECRET = コンシューマーシークレット TWITTER_ACCESS_TOKEN = アクセストークン TWITTER_ACCESS_TOKEN_SECRET = アクセストークンシークレット
を必要に応じて追加します。
ルートの設定
ツイッターで認証を行うためにはログイン、コールバックのルートが最低限必要です。
ログアウトもあると良いでしょう。
Route::get('twitter/login', 'TwitterController@login')->name('twitter.login'); Route::get('twitter/callback', 'TwitterController@callback')->name('twitter.callback'); Route::get('twitter/logout', 'TwitterController@logout')->name('twitter.logout');
と/twitter/アクション名 でルートを作成しました。
コントローラの作成
ツイッターの機能は1つのコントローラーで管理したいので、ツイッター用のコントローラーを作成します。
php artisan make:controller TwitterController
app/Http/Controllers内にTwitterController.phpが作成されるのでこのファイルに処理を書いていきます。
Inputクラスを利用するのですが、新しめのバージョンのLaravelだとInputがファザードとして用意されていないのでクラスを直接指定します。
use Input; だとエラーが発生してちょっと困りました。
use Illuminate\Support\Facades\Input;
public function login() { $sign_in_twitter = true; $force_login = false; // Make sure we make this request w/o tokens, overwrite the default values in case of login. Twitter::reconfig(['token' => '', 'secret' => '']); $token = Twitter::getRequestToken(route('twitter.callback')); if (isset($token['oauth_token_secret'])) { $url = Twitter::getAuthorizeURL($token, $sign_in_twitter, $force_login); Session::put('oauth_state', 'start'); Session::put('oauth_request_token', $token['oauth_token']); Session::put('oauth_request_token_secret', $token['oauth_token_secret']); return Redirect($url); } return Redirect('twitter.error'); } public function logout() { Session::forget('access_token'); return Redirect(''); } public function callback() { if (Session::has('oauth_request_token')) { $request_token = [ 'token' => Session::get('oauth_request_token'), 'secret' => Session::get('oauth_request_token_secret'), ]; Twitter::reconfig($request_token); $oauth_verifier = false; if (Input::has('oauth_verifier')) { $oauth_verifier = Input::get('oauth_verifier'); } // getAccessToken() will reset the token for you $token = Twitter::getAccessToken($oauth_verifier); if (!isset($token['oauth_token_secret'])) { return Redirect::route('twitter.login')->with('flash_error', 'We could not log you in on Twitter.'); } $credentials = Twitter::getCredentials(); if (is_object($credentials) && !isset($credentials->error)) { // $credentials contains the Twitter user object with all the info about the user. // Add here your own user logic, store profiles, create new users on your tables...you name it! // Typically you'll want to store at least, user id, name and access tokens // if you want to be able to call the API on behalf of your users. // This is also the moment to log in your users if you're using Laravel's Auth class // Auth::login($user) should do the trick. Session::put('access_token', $token); return Redirect::to('/')->with('flash_notice', 'Congrats! You\'ve successfully signed in!'); } return Redirect('/'); } }
こんな簡単にツイッターの認証が実装出来てしまうんですね。
もうサービスとしては末期に見えてしまうツイッターですが1つ2つくらいアプリを作ってみたいなと思います。
コメント