概要
下記の内容を実施してSocialite側からスコープを設定した。
その後web.phpのログイン側の処理にてOAuth2.0のアクセストークンとリフレッシュトークンを取得する処理を記載した。
// Googleからのコールバックを受け取る
Route::get('/auth/callback', function () {
try {
$googleUser = Socialite::driver('google')->user();
$accessToken = $googleUser->token;
$refreshToken = $googleUser->refreshToken;
} catch (Exception $e) {
Log::error($e);
return redirect(route('home'));
}
Log::info('accessToken: ' . $accessToken);
Log::info('refreshToken: ' . $refreshToken);
// ユーザーが既に存在するか確認
$user = User::where('email', $googleUser->getEmail())->first();
if (!$user) {
// ユーザーが存在しない場合、新規作成
$user = User::create([
'name' => $googleUser->getName(),
'email' => $googleUser->getEmail(),
'google_id' => $googleUser->getId(),
'password' => Hash::make(Str::random(16)),
]);
}
// ユーザーをログインさせる
Auth::login($user);
// リダイレクト先を指定
return redirect(route('dashboard'));
})->name('google.callback');
修正した処理を画面側からの操作で実行し、ログを確認するとaccessTokenは出力されているが、refreshTokenが出力されていない。
この問題を解消する方法をまとめる。
解消方法
Googleの認証画面にリダイレクトする処理を下記のように修正する。
// Googleの認証ページへのリダイレクト
Route::get('/auth/redirect', function () {
return Socialite::driver('google')
->scopes(['email', 'profile', 'https://www.googleapis.com/auth/cloud-platform.read-only'])
->with(['access_type' => 'offline', 'prompt' => 'consent']) // こちらを追記
->redirect();
})->name('google.redirect');
これでトークン取得リクエストのレスポンスでリフレッシュトークンが返るようになる。
問題の特定方法
-
vendor/laravel/socialite/src/Two/AbstractProvider.php
のuser()
の中にdd()
を記載してレスポンスを出力してみるvendor/laravel/socialite/src/Two/AbstractProvider.php/** * {@inheritdoc} */ public function user() { if ($this->user) { return $this->user; } if ($this->hasInvalidState()) { throw new InvalidStateException; } $response = $this->getAccessTokenResponse($this->getCode()); dd($response); $user = $this->getUserByToken(Arr::get($response, 'access_token')); return $this->userInstance($response, $user); }
-
laravel側のアプリケーションで一旦ログイン後に
/auth/redirect
にアクセスし、再度ログイン -
レスポンスの中にrefreshTokenのキーバーリューが存在していない
-
前述した
->with(['access_type' => 'offline', 'prompt' => 'consent'])
を追記 -
laravel側のアプリケーションで一旦ログイン後に
/auth/redirect
にアクセスし、再度ログイン -
レスポンスの中にrefreshTokenのキーバーリューが存在するようになった
-
vendor/laravel/socialite/src/Two/AbstractProvider.php
のuser()
の中のdd()
を削除 -
laravel側のアプリケーションで一旦ログイン後に
/auth/redirect
にアクセスし、再度ログイン -
ログにアクセストークンとリフレッシュトークンが出力された