Laravel Socialiteは、Facebook、Google、Twitterなどの外部サービスと連携したOAuth認証を簡単に実装できるパッケージです。この記事では、Laravel Socialiteの導入から基本的な使い方までを解説します。
前提
- Laravel 11.x
- Laravel Socialite 5.x
事前準備
Google Cloud PlatformでクライアントIDとクライアントシークレットを作成します。
下記手順を参考に、作成してください。
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以外の外部サービスも同様の手順で実装できるので、是非トライしてみてください。