Laravel SocialiteでGoogleログイン認証

Laravel

Laravel Socialiteは、Facebook、Google、Twitterなどの外部サービスと連携したOAuth認証を簡単に実装できるパッケージです。この記事では、Laravel Socialiteの導入から基本的な使い方までを解説します。

前提

  • Laravel 11.x
  • Laravel Socialite 5.x

事前準備

Google Cloud PlatformでクライアントIDとクライアントシークレットを作成します。

下記手順を参考に、作成してください。

OAuth ウェブ クライアント ID を作成する - Google Workspace Migrate
Google Cloud で、Google Workspace Migrate プラットフォーム用の OAuth ウェブ クライアント ID を作成します。 ウェブ クライアント ID の作成手順 重要: 2022 年 8 月 7 日以降に OAuth ウェブ クライアントを作成する場合は、Google Workspa...

OAuthクライアントは下記のように設定すればOKです。

Laravel Socialiteのインストール

まず、LaravelプロジェクトにSocialiteをインストールします。

composer require laravel/socialite

Googleの認証情報を設定する

config/services.phpファイルに、各サービスの設定を追加します。

Googleを使用する場合は次のように設定します。

'google' => [
    'client_id' => env('GOOGLE_CLIENT_ID'),
    'client_secret' => env('GOOGLE_CLIENT_SECRET'),
    'redirect' => env('GOOGLE_REDIRECT_URL'),
],

次に設定値を.envファイルに環境変数として定義します。

GOOGLE_CLIENT_ID=作成したクライアントID
GOOGLE_CLIENT_SECRET=クライアントシークレット
GOOGLE_REDIRECT_URL=http://localhost/auth/google/callback 
# 本番環境ではドメインを書き換える。GCPで設定した「承認済みのリダイレクトURI」を使用すること

ルーティングの設定

次に、OAuth認証のためのルートを設定します。routes/web.phpに次のように追加します。

use App\Http\Controllers\Auth\LoginController;

// ここのurlは任意
Route::get('auth/google', [LoginController::class, 'redirectToGoogle'])->name('auth.google');

// こっちはGOOGLE_REDIRECT_URLと合わせること
Route::get('auth/google/callback', [LoginController::class, 'handleGoogleCallback']);

auth/googleのURLは任意ですが、
auth/google/callbackのところは環境変数「GOOGLE_REDIRECT_URL」とGoogle Cloud Platformの管理画面で設定した「承認済みのリダイレクト URI」と合わせましょう。

これにより、ユーザーが/auth/googleにアクセスするとGoogleのOAuth認証ページにリダイレクトされるように設定できました。

コントローラーの実装

LoginControllerを作成し、OAuth認証を処理するメソッドを追加します。

php artisan make:controller Auth/LoginController
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Laravel\Socialite\Facades\Socialite;
use App\Models\User;
use Illuminate\Support\Str;

class LoginController extends Controller
{
    public function redirectToGoogle()
    {
        return Socialite::driver('google')->redirect();
    }

    public function handleGoogleCallback()
    {
        $googleUser = Socialite::driver('google')->stateless()->user();

        $user = User::updateOrCreate([
            'email' => $googleUser->getEmail(),
        ], [
            'name' => $googleUser->getName(),
            'email' => $googleUser->getEmail(),
            // 必要に応じて他のフィールドを設定
            'password' => bcrypt(Str::random(16)), // ランダムなパスワードを生成(使用しないので任意でOK)
        ]);

        // ユーザーをログインさせる
        Auth::login($user, true);

        // ホームページへリダイレクト
        return redirect('/home');
    }
}

リンクをviewに設定

最後に、Google認証ページへのリンクをviewに設定します。

<a href="{{ route('auth.google') }}">Googleでログイン</a>

これで、ユーザーはリンクをクリックするだけでGoogleアカウントを使用してログインできます。

検証

上記の例ではログイン後に/homeへ遷移するようにしました。

実際にviewを用意し、ログイン後のユーザー情報を表示してみます。

また、ログアウトもできるようにします。

web.phpにルーティングを簡易的に追加します。

Route::get('/home', function () {
    $user = Auth::user(); // ログインしているユーザー情報を取得
    if (!$user) {
        return redirect('/'); // ログインしていない場合はトップページへリダイレクト
    }
    return view('home', ['user' => $user]);
})->name('home');

Route::post('/logout', function () {
    Auth::logout(); // ユーザーをログアウト
    return redirect('/'); // ログアウト後にリダイレクトするページ
})->name('logout');

resources/views/home.blade.phpにviewを追加します。

<div>
    <h1>ようこそ, {{ $user->name }}さん!</h1>
    <p>あなたのメールアドレス: {{ $user->email }}</p>
    <p>アカウント作成日: {{ $user->created_at->format('Y-m-d') }}</p>

    <form action="{{ route('logout') }}" method="POST">
        @csrf
        <button type="submit">ログアウト</button>
    </form>
</div>

この状態でログインすると、ログインしたユーザーの情報が見れるはずです。

ログアウトもできることを確認してみましょう。

まとめ

Laravel Socialiteを使用すると、複雑なOAuth認証を非常にシンプルに実装できます。

Google以外の外部サービスも同様の手順で実装できるので、是非トライしてみてください。