はじめに
うわっ…私の記事、タイトル長すぎ…?
と思わなくもなかったのですが、↓の続編ということがわかりやすいようにしました。
前回、LaravelのSocialiteを使ってGoogleのソーシャルログインが実装できたので、今回はログアウト→別アカウントでログインという処理を実装したら、思ったより苦労したという備忘録です。
環境やソースコードは前回のものを使っています。
ログアウト処理の実装
まずは以下のように実装してみました。
resources\views\welcome.blade.php
好きな場所に以下のログアウト用リンクを設置
@auth
<a href="{{ url('/logout') }}">logout</a>
@endauth
routes\web.php
末尾に以下を追記
Route::get('/logout', [GoogleLoginController::class, 'logout']);
app\Http\Controllers\GoogleLoginController.php
以下の関数を追加
public function logout()
{
Auth::logout();
return redirect('/');
}
これでどうなったかというと、ログアウト→同じアカウントで自動ログインという動作になりました。
考えてみれば当たり前なのですが、Auth::logout();
というのはあくまでPHPで実装したアプリ内の話であり、Googleアカウントのログイン状態やアプリ連携には影響しないため、ログイン画面に戻ると同じアカウントでGoogle認証まで通ってしまうわけですね。
ちなみに、手動での連携の削除はGoogleアカウントのサードパーティ製のアプリとサービスからできます。
どうやって解決したか
アプリ側からGoogleアカウントを制御することはできないのですが、色々と調べた結果、「approval_prompt = force」というパラメータを指定することで、強制的に認証画面を出せるということがわかりました(公式ドキュメントがこういうのしかなくて探すのに苦労しました)(Twitterみたいにまとめて欲しい・・・)
というわけで、ログイン状態をチェックして、ログアウト状態の場合は強制的に認証画面に遷移するという実装が以下となります。
app\Http\Controllers\GoogleLoginController.php
以下の関数を書き換え。
public function getGoogleAuth()
{
return Auth::check() ?
Socialite::driver('google')->redirect() :
Socialite::driver('google')->with(['approval_prompt' => 'force' ])->redirect();
}
これで、ログアウト後に認証画面からアカウントを切り替えられるようになりました。
おわりに
ソーシャルログインは便利ですが、アプリ側とソーシャル側のログイン状態や連携は別物というのを意識しておかないと、想定した動作にならないことがあるので注意が必要ですね。
Googleで複数アカウントを使い分けるケースはあまり無いかもしれませんが、会社の個人アカウントと情シスの運用アカウントを切り替えたり、共用PCでGoogleログインを使うなどで必要になった時に参考になれば幸いです。