はじめに
OAuthによるログインの実装は、一度外部サービスへリダイレクトを行って、外部サービスから自サービスのコールバックエンドポイントにリダイレクトを受けるという流れになります。
ログイン時には、「どの画面からログインを試みたのか?」 「どういう登録導線からログインされたのか?」 といったログイン処理前の情報を受け取りたいニーズがある場合があります。
このとき、ログイン画面からコールバックエンドポイントに情報を伝達したい場合どうしたらいいかという話です。
ログインに限らず、登録のケースでも同じようにできます。
セッションを利用する
HTTPはステートレスなので、リクエストをまたがって情報を保持するには以下のいずれか対応をする必要があります。
- POSTパラメータまたはGETパラメータを次ページに引回す
- セッションにデータを紐づけて一時的に保持する
- クッキーにユーザを特定するキーを仕込んで、DBに保存した値と紐づける
1の方法はFacebook認証では実現できませんでした。1
OAuthによるログインはSocialiteというOAuthパッケージを利用する前提です。
// OAuth先サービスにリダイレクト
public function redirectToProvider(Request $request)
{
// どのページからログインを試みたのかセッションに保持する
$request->session()->push('loggedin-from','register-page-01');
return Socialite::driver('facebook')->redirect();
}
// OAuth先サービスからのリダイレクトを受けるエンドポイント
public function handleProviderCallback(Request $request) {
// セッションから情報を取得する
$loggedInFrom = $request->session()->get('loggedin-from', ’no-data’);
// 略) OAuth先から情報を取得してログインする処理
}
-
GETクエリは設定でき、OAuthの連携先であるFacebookにGETパラメータが送られるが、コールバック時にGETパラメータを返してくれなかったので、自サービスが受けるコールバックまでデータを伝搬できなかった。
3の方法でも実現できますが、2の方がお手軽なので選択しませんでした。 ↩