0
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?

laravel ✕ OAuth2.0 Socialiteを使ったアクセストークン取得でリフレッシュトークンが取得できない

Last updated at Posted at 2025-06-03

概要

下記の内容を実施してSocialite側からスコープを設定した。

その後web.phpのログイン側の処理にてOAuth2.0のアクセストークンとリフレッシュトークンを取得する処理を記載した。

routes/web.php
// 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の認証画面にリダイレクトする処理を下記のように修正する。

routes/web.php
// 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');

これでトークン取得リクエストのレスポンスでリフレッシュトークンが返るようになる。

問題の特定方法

  1. vendor/laravel/socialite/src/Two/AbstractProvider.phpuser()の中に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);
    }
    
  2. laravel側のアプリケーションで一旦ログイン後に/auth/redirectにアクセスし、再度ログイン

  3. レスポンスの中にrefreshTokenのキーバーリューが存在していない

  4. 前述した->with(['access_type' => 'offline', 'prompt' => 'consent'])を追記

  5. laravel側のアプリケーションで一旦ログイン後に/auth/redirectにアクセスし、再度ログイン

  6. レスポンスの中にrefreshTokenのキーバーリューが存在するようになった

  7. vendor/laravel/socialite/src/Two/AbstractProvider.phpuser()の中のdd()を削除

  8. laravel側のアプリケーションで一旦ログイン後に/auth/redirectにアクセスし、再度ログイン

  9. ログにアクセストークンとリフレッシュトークンが出力された

0
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
0
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?