【Laravel10 + Socialite】GitHubソーシャルログインを実装する

GitHub

Laravel SocialiteでGitHub経由のソーシャルログインを実装した際の記録と解説です。

Laravel - The PHP Framework For Web Artisans
Laravel is a PHP web application framework with expressive, elegant syntax. We’ve already laid the foundation — freeing ...

この記事のゴール

Laravel10とSocialiteをインストールしてから、

ログイン機能を実装して動作確認まで行います。

公式ドキュメントに忠実に最低限の実装だけを進めます。

公式ドキュメントの説明で実装できるのは、

  • OAuthプロバイダーの認証ページへのリダイレクト
  • ローカルのコールバック側のユーザー登録と自動ログイン

の2つだけです。

リダイレクト前の、ソーシャルログインへの誘導リンクや

ログイン後のダッシュボードなどは自前で実装する必要があります。

前提条件

  • Ubuntu上で作業しています
  • PHP8.1以降インストール済
  • Composerインストール済
  • GitHubアカウントを持っている
  • DBはSQLiteを使います

環境構築(Laravel10 + Socialite)

Laravel10の新規プロジェクト「webapp-socialite」を作成します。

composer create-project laravel/laravel:^10 webapp-socialite

プロジェクトフォルダに入ってSocialiteをインストールします。

cd webapp-socialite/
composer require laravel/socialite

GitHubへのOAuthアプリ登録

OAuthを利用する際には、GitHubやGoogle、FacebookなどのOAuthプロバイダーへのアプリ登録が必用です。

現時点(2024/02/11)でSocialiteで利用可能なのは、Facebook, Twitter, LinkedIn, Google, GitHub, GitLab, Bitbucket, Slackです。

「Socialite Providers」を使うと、他のプロバイダーを利用することができます。

Socialite Providers
A Collection of Providers for Laravel Socialite

今回は、Laravel公式ドキュメントの設定例で記載されているGitHubを利用していきます。

GitHubへのOAuthアプリ登録については別記事にしたので

こちらの記事を参照してください。

.env編集

プロジェクトトップにある「.env」を編集・保存します。

APP_URL=http://localhost:8000

に変更します。ポート番号は環境に合わせて変更してください。

DB_CONNECTION=sqlite

に変更して、他のDB項目をすべて削除します。

また、前段のアプリ登録時に取得したGitHubのclient_idとclient_secretを、

  • GITHUB_CLIENT_ID
  • GITHUB_CLIENT_SECRET

として追記します。

config/services.php編集

次に、「config/services.php」に追記・保存します。

    'github' => [
        'client_id' => env('GITHUB_CLIENT_ID'),
        'client_secret' => env('GITHUB_CLIENT_SECRET'),
        'redirect' => env('APP_URL') . '/oauth/github/callback',
    ],

マイグレーション

公式ドキュメントには一切記載が無いですが、

次のカラムが必用になります。

  • github_id
  • github_token
  • github_refresh_token

今回は、これらを既存のusersテーブルに追加します。

「database/migrations/*_create_users_table.php」に追記します。

            $table->string('github_id')->nullable();
            $table->string('github_token')->nullable();
            $table->string('github_refresh_token')->nullable();

「password」カラムをnullableにする記事を見かけますが、

既存のログイン機構を使う上で「password」カラムをnullableにすべきではありません。

それはセキュリティホールを作ることと同義です。

何らかの手段でvalidation()をすり抜けられてしまうと終わりです。

セキュリティ上の防壁は何重にも張っておくべきです。

マイグレーションを実行します。

php artisan migrate

「Would you like to create it?」と訊かれるので、

[←]キーで「Yes」を選択して[Enter]キーで確定します。

モデル編集

「app/Modesl/User.php」の$fillableに追記します。

        'github_id',
        'github_token',
        'github_refresh_token',

ルーティング

「routes/web.php」に追記します。

<?php

use Illuminate\Support\Facades\Route;
use Laravel\Socialite\Facades\Socialite;
use App\Models\User;
use Illuminate\support\Facades\Auth;
use Illuminate\Support\Str;

Route::get('/', function () {
    return view('welcome');
});

Route::get('/oauth/github/redirect', function () {
    return Socialite::driver('github')->redirect();
});

Route::get('/oauth/github/callback', function () {
    $githubUser = Socialite::driver('github')->user();
    $user = User::updateOrCreate([
        'github_id' => $githubUser->id,
    ], [
        'name' => $githubUser->name,
        'email' => $githubUser->email,
        'password' => Str::random(40),
        'github_token' => $githubUser->token,
        'github_refresh_token' => $githubUser->refreshToken,
    ]);
    Auth::login($user);
    return redirect('/dashboard');
});

※(2024/02/20一部修正):

'password' => fake()->regexify('[A-Za-z0-9_\-\+\@\!]{8,16}'),

の箇所を

'password' => Str::random(40),

に修正しました。

fake() はテスト用のメソッドであり、本番環境用に実装するものではないためです。

この実装のために

use Illuminate\Support\Str;

を追記しています。

WEBサービス起動

LaravelのWEBサービスを起動します。

php artisan serve

ブラウザ確認

WEBブラウザで

http://127.0.0.1:8000/

にアクセスします。

LaravelのWelcomeページが表示されました。

http://127.0.0.1:8000/oauth/github/redirect

にアクセスします。

GitHubのOAuth認証画面にリダイレクトされます。

「Authorize …」ボタンをクリックします。

GitHub側で認証成功後、ローカルアプリ側へリダイレクトされます。

URLを見てみるとこのようになっています。

http://localhost:8000/oauth/github/callback?code=7906db2a62a63adc47fb&state=VFIF50W6heyul5Ea7S8HGCmSIKcO06CcMmge2I0I

コールバック側でユーザー登録とログインが完了すると、

ダッシュボードへ転送されますが、

ダッシュボードは実装していないので「404 NOT FOUND」となります。

DBレコードを確認すると、ユーザーが登録されています。

GitHubの登録アプリのページ側を見てみると、

ユーザーが1件登録されています。

「Revoke all user tokens」ボタンを押すと、認証した全ユーザーのトークンを取り消すことができます。

一応、初回の認証は問題なく通りました。

2度目の認証をしてみます。

再度、WEBブラウザで

http://127.0.0.1:8000/oauth/github/redirect

にアクセスします。

今回は認証の確認画面が表示されず、ダッシュボードへ転送されました。

DBレコードを確認すると、passwordとgithub_tokenが更新されています。

今回はここまでです。お疲れさまでした。

続きはこちらです。

参考サイト

▼(Official) Laravel Socialite

Laravel - The PHP Framework For Web Artisans
Laravel is a PHP web application framework with expressive, elegant syntax. We’ve already laid the foundation — freeing ...

▼(GitHub) OAuth アプリを使用した REST API の認証

OAuth アプリを使用した REST API の認証 - GitHub Docs
さまざまな認証方法について、いくつかの例で学びます。

▼(GitHub) OAuth アプリの承認

OAuth アプリの承認 - GitHub Docs
他のユーザーが OAuth app を承認できるようにすることができます。

▼(Qiita) Laravel API SNSログイン機能を実装する

Laravel API SNSログイン機能を実装する - Qiita
Laravel SocialiteLaravelの公式からOAuthプロバイダで認証するための便利なライブラリが提供されています。…

▼(Qiita) Laravel+Socialiteで簡単ソーシャルログイン実装! (テスト付き)

Laravel+Socialiteで簡単ソーシャルログイン実装! (テスト付き) - Qiita
Socialiteを使ってLaravelで簡単にソーシャルログインを実装する方法をテスト付きで紹介したいと思います。ソースはこちら※ 上記ソースを clone する場合は php artisan…

コメント

タイトルとURLをコピーしました