Twitter
laravel
Socialite

Laravel Socialiteで認証後のリダイレクト先を動的に設定する

はじめに

リダイレクト先の設定はconfig/services.phpに書くことで設定は可能ですが、
マルチテナントなシステムで、テナントごとに戻り先が替わる場合には設定ファイルの定義だけでは定義しきれない。
これの解決方法を残しておきます。

コードはTwitterで書きます。

どうやるの?

  • customCreatorsでインスタンスを作るようにする。

これだけ。
中身は、

\Laravel\Socialite\SocialiteManager::createTwitterDriver()

そのまま。

public function redirectToProvider($tenant)
{
    $url = route('hogehoge.twitter.callback', [$tenant]);

    $provider = Socialite::extend('twitter', function ($app) use ($url) {
        $config = $app['config']['services.twitter'];
        $config['redirect'] = $url;

        return new TwitterProvider(
            $app['request'], new TwitterServer(Socialite::formatConfig($config))
        );
    })->driver('twitter');
}

テナントごとに各キー値を書き換えたければ、他のも書き換えればOK。

他の方法は?

Socialite::driver('twitter')で取れるTwitterProviderの$serverプロパティを取るためにズルする。
$serverプロパティを取れれば、getClientCredentials()->setCallbackUri($new_uri)で書き換え可能。

終わりに

本当はredirect先だけ書き換えれれば良かったので、インスタンス毎作る必要はないけど、
設計思想がconfigの設定で1セットって考え方だと思うので、こうなるのかなーと割り切ってコレで実装しました。
他のイイやり方があったら是非教えてください。