Laravel で Google 認証

3 min read読了の目安(約2900字

はじめに

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',
    ],
];

合わせて.envGOOGLE_CLIENT_IDGOOGLE_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@redirectToProviderAuth\LoginController@handleProviderCallbackは後述です。

コントローラ

Auth\LoginController@redirectToProviderAuth\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等)でもできるそうなので色々試してみたいです。