Laravel で Google 認証
はじめに
Google 認証の実装方法をメモレベルではありますが備忘録として記載します。
環境
- Laravel 6.x
パッケージインストール
以下コマンドで必要なパッケージをインストールします。
$ composer require laravel/socialite
設定
以下の様に設定ファイルを更新します。
config/services.php
<?php
return [
// 略
'google' => [
'client_id' => env('GOOGLE_CLIENT_ID'),
'client_secret' => env('GOOGLE_CLIENT_SECRET'),
'redirect' => env('APP_URL') . '/login/google/callback',
],
];
合わせて.env
にGOOGLE_CLIENT_ID
とGOOGLE_CLIENT_SECRET
を設定しておきましょう。
ルート
以下の様にルートファイルを更新します。
routes/web.php
<?php
// 略
Route::get('login/google', 'Auth\LoginController@redirectToProvider')->name('auth.redirectToGoogle');
Route::get('login/google/callback', 'Auth\LoginController@handleProviderCallback')->name('auth.handleProviderCallback');
// 略
Auth\LoginController@redirectToProvider
とAuth\LoginController@handleProviderCallback
は後述です。
コントローラ
Auth\LoginController@redirectToProvider
とAuth\LoginController@handleProviderCallback
を実装していきます。
app/Http/Controllers/Auth/LoginController.php
<?php
// 略
use Laravel\Socialite\Contracts\Factory as Socialite;
// 略
class LoginController extends Controller
{
// 略
private $socialite;
// 略
public function __construct(Socialite $socialite)
{
$this->socialite = $socialite;
}
public function redirectToGoogle()
{
return $this->socialite->driver('google')->redirect();
}
public function handleProviderCallback()
{
$googleUser = $this->socialite->driver('google')->user();
/*
後続処理実装例
1. $googleUser を元に User モデルを取得してログイン
2. 特定ページにリダイレクト
*/
}
}
サービスプロバイダー
以下の様に各種ファイルを作成します。
app/Socialite/MySocialManager.php
<?php
namespace App\Socialite;
use Laravel\Socialite\SocialiteManager;
use Laravel\Socialite\Two\GoogleProvider;
class MySocialManager extends SocialiteManager
{
protected function createGoogleDriver()
{
$config = $this->config->get('services.google');
$config['redirect'] = route('auth.handleProviderCallback');
return $this->buildProvider(
GoogleProvider::class,
$config
);
}
}
app/Socialite/MySocialServiceProvider.php
<?php
namespace App\Socialite;
use Laravel\Socialite\SocialiteServiceProvider;
class MySocialServiceProvider extends SocialiteServiceProvider
{
public function register()
{
$this->app->singleton('Laravel\Socialite\Contracts\Factory', function ($app) {
return new MySocialManager($app);
});
}
}
以下の様に設定ファイルを更新します。
config/app.php
<?php
return [
// 略
'providers' => [
// 略
App\Socialite\MySocialServiceProvider::class,
],
// 略
];
ビュー
さいごに/login/google
へのリンクを実装すれば動作確認できると思います。
おわりに
けっこう簡単にできた。
他のサービス(Github等)でもできるそうなので色々試してみたいです。