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認証なんだから、パスワードの管理などしたくないのだ。

この時点でのぼく f:id:djredhuman:20160415153712j:plain

さらにいろいろ調べると、(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なんてもんありません」って言ってくる。

いやいやいや、あるでしょー!さすがにあるでしょー!? > 探す >ない

f:id:djredhuman:20160415153712j:plain

さらにぐぐると、たどり着きました。

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()でも通るのかな。