1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Windowsのローカル環境でLaravelのGoogleログインにアカウント切り替えを実装してみた話

Last updated at Posted at 2023-09-20

はじめに

うわっ…私の記事、タイトル長すぎ…?
と思わなくもなかったのですが、↓の続編ということがわかりやすいようにしました。

前回、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ログインを使うなどで必要になった時に参考になれば幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?