laravel5.2 Socialite で twitter認証のログイン処理
socialteの導入方法はネットにある通り。
/** * twitterへリダイレクト * * @return mixed */ public function redirectToTwitter() { if (Auth::check()) { return redirect('/'); } else { return Socialite::driver('twitter')->redirect(); } } /** * コールバック */ public function callbackFromTwitter() { try { $user = Socialite::driver('twitter')->user(); } catch (Exception $e) { var_dump('失敗'); } $userModel = new User(); $user_info = $userModel->newEntry($user); // Auth::login($user_info, true); // (1) Auth::loginUsingId($user_info->id, true); // (2) return redirect('/'); }
ネットの各日本語ドキュメントを読んで、最初(1)と書いた。 しかし、この Auth::login() だと id や password などが必要っぽくてどうもうまくいかない。OAuth認証なんだから、パスワードの管理などしたくないのだ。
この時点でのぼく
さらにいろいろ調べると、(2)Auht::loginUsingIdというメソッドがあるらしい。なるほど、これならidだけでよしなにしてくれそう。
でも動かず。
Type error: Argument 1 passed to Illuminate\Auth\SessionGuard::login() must be an instance of Illuminate\Contracts\Auth\Authenticatable, null given, called in /var/www/laravel/vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php on line 477
さらにぐぐると、これを見つける。
LINK:【 Laravel Recipes日本語版 | 認証に使うモデルを変更する 】
おーなるほど、Authはセッションにあるかどうかとかだけじゃなくユーザ情報を登録するテーブルなんかもいろいろ見てくれているのか。
早速Modelに追加。
use Illuminate\Auth\UserInterface; class User extends \Eloquent implements UserInterface { }
するとphpstromが 「UserInterfaceなんてもんありません」って言ってくる。
いやいやいや、あるでしょー!さすがにあるでしょー!? > 探す >ない
さらにぐぐると、たどり着きました。
LINK:【 アップグレードガイド 5.1 Laravel 】
なるほど、このようにバージョンアップで変わったようです。
use Illuminate\Auth\Authenticatable; // UserInterfaceから変更
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; // こんなのもいるって
class User extends Model implements AuthenticatableContract
{
use Authenticatable; // trait を取り込んでね
}
通った。 (正確に言うと、remember_tokenというカラムがない!と怒られたので追加したら)
ふーむ、もしかしたらこれをやればAuth::login()でも通るのかな。