Laravel SocialiteでGitHub経由のソーシャルログインを実装した際の記録と解説です。
![](https://macocci7.net/blog/wp-content/uploads/cocoon-resources/blog-card-cache/ac4098820121124c276f1d0008e904d4.jpg)
この記事のゴール
Laravel10とSocialiteをインストールしてから、
ログイン機能を実装して動作確認まで行います。
公式ドキュメントに忠実に最低限の実装だけを進めます。
公式ドキュメントの説明で実装できるのは、
- OAuthプロバイダーの認証ページへのリダイレクト
- ローカルのコールバック側のユーザー登録と自動ログイン
の2つだけです。
リダイレクト前の、ソーシャルログインへの誘導リンクや
ログイン後のダッシュボードなどは自前で実装する必要があります。
![](https://macocci7.net/blog/wp-content/uploads/2024/02/laravel_socialite_09.png)
前提条件
- Ubuntu上で作業しています
- PHP8.1以降インストール済
- Composerインストール済
- GitHubアカウントを持っている
- DBはSQLiteを使います
環境構築(Laravel10 + Socialite)
Laravel10の新規プロジェクト「webapp-socialite」を作成します。
composer create-project laravel/laravel:^10 webapp-socialite
![](https://macocci7.net/blog/wp-content/uploads/2024/02/laravel_socialite_01.png)
プロジェクトフォルダに入ってSocialiteをインストールします。
cd webapp-socialite/
composer require laravel/socialite
![](https://macocci7.net/blog/wp-content/uploads/2024/02/laravel_socialite_02.png)
GitHubへのOAuthアプリ登録
OAuthを利用する際には、GitHubやGoogle、FacebookなどのOAuthプロバイダーへのアプリ登録が必用です。
現時点(2024/02/11)でSocialiteで利用可能なのは、Facebook, Twitter, LinkedIn, Google, GitHub, GitLab, Bitbucket, Slackです。
「Socialite Providers」を使うと、他のプロバイダーを利用することができます。
今回は、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
として追記します。
![](http://macocci7.net/blog/wp-content/uploads/2024/02/laravel_socialite_03.png)
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',
],
![](https://macocci7.net/blog/wp-content/uploads/2024/02/laravel_socialite_04.png)
マイグレーション
公式ドキュメントには一切記載が無いですが、
次のカラムが必用になります。
- 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();
![](http://macocci7.net/blog/wp-content/uploads/2024/02/laravel_socialite_10.png)
「password」カラムをnullableにする記事を見かけますが、
既存のログイン機構を使う上で「password」カラムをnullableにすべきではありません。
それはセキュリティホールを作ることと同義です。
何らかの手段でvalidation()をすり抜けられてしまうと終わりです。
セキュリティ上の防壁は何重にも張っておくべきです。
マイグレーションを実行します。
php artisan migrate
![](https://macocci7.net/blog/wp-content/uploads/2024/02/laravel_socialite_05.png)
「Would you like to create it?」と訊かれるので、
[←]キーで「Yes」を選択して[Enter]キーで確定します。
モデル編集
「app/Modesl/User.php」の$fillableに追記します。
'github_id',
'github_token',
'github_refresh_token',
![](https://macocci7.net/blog/wp-content/uploads/2024/02/laravel_socialite_11.png)
ルーティング
「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
![](https://macocci7.net/blog/wp-content/uploads/2024/02/laravel_socialite_06.png)
ブラウザ確認
WEBブラウザで
http://127.0.0.1:8000/
にアクセスします。
![](https://macocci7.net/blog/wp-content/uploads/2024/02/laravel_socialite_07.png)
LaravelのWelcomeページが表示されました。
http://127.0.0.1:8000/oauth/github/redirect
にアクセスします。
GitHubのOAuth認証画面にリダイレクトされます。
![](https://macocci7.net/blog/wp-content/uploads/2024/02/laravel_socialite_08.png)
「Authorize …」ボタンをクリックします。
GitHub側で認証成功後、ローカルアプリ側へリダイレクトされます。
URLを見てみるとこのようになっています。
http://localhost:8000/oauth/github/callback?code=7906db2a62a63adc47fb&state=VFIF50W6heyul5Ea7S8HGCmSIKcO06CcMmge2I0I
コールバック側でユーザー登録とログインが完了すると、
ダッシュボードへ転送されますが、
ダッシュボードは実装していないので「404 NOT FOUND」となります。
![](https://macocci7.net/blog/wp-content/uploads/2024/02/laravel_socialite_12.png)
DBレコードを確認すると、ユーザーが登録されています。
![](http://macocci7.net/blog/wp-content/uploads/2024/02/laravel_socialite_18.png)
GitHubの登録アプリのページ側を見てみると、
ユーザーが1件登録されています。
![](https://macocci7.net/blog/wp-content/uploads/2024/02/laravel_socialite_17.png)
「Revoke all user tokens」ボタンを押すと、認証した全ユーザーのトークンを取り消すことができます。
一応、初回の認証は問題なく通りました。
2度目の認証をしてみます。
再度、WEBブラウザで
http://127.0.0.1:8000/oauth/github/redirect
にアクセスします。
今回は認証の確認画面が表示されず、ダッシュボードへ転送されました。
![](https://macocci7.net/blog/wp-content/uploads/2024/02/laravel_socialite_12-1.png)
DBレコードを確認すると、passwordとgithub_tokenが更新されています。
![](https://macocci7.net/blog/wp-content/uploads/2024/02/laravel_socialite_19.png)
今回はここまでです。お疲れさまでした。
続きはこちらです。
参考サイト
▼(Official) Laravel Socialite
![](https://macocci7.net/blog/wp-content/uploads/cocoon-resources/blog-card-cache/ac4098820121124c276f1d0008e904d4.jpg)
▼(GitHub) OAuth アプリを使用した REST API の認証
![](https://macocci7.net/blog/wp-content/uploads/cocoon-resources/blog-card-cache/513a2fe403a179cd13970f0e76bdc69e.png)
▼(GitHub) OAuth アプリの承認
![](https://macocci7.net/blog/wp-content/uploads/cocoon-resources/blog-card-cache/513a2fe403a179cd13970f0e76bdc69e.png)
▼(Qiita) Laravel API SNSログイン機能を実装する
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZoPTMzNiZ0eHQ9TGFyYXZlbCUyMEFQSSUyMFNOUyVFMyU4MyVBRCVFMyU4MiVCMCVFMyU4MiVBNCVFMyU4MyVCMyVFNiVBOSU5RiVFOCU4MyVCRCVFMyU4MiU5MiVFNSVBRSU5RiVFOCVBMyU4NSVFMyU4MSU5OSVFMyU4MiU4QiZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnR4dC1jbGlwPWVsbGlwc2lzJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9MDU1MTU4Mjk2ZjRjOWVlMjEyNGQ0YWFiYjBmZDU5MGE&mark-x=142&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwdWNhbi1sYWImdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPTg2MWQxY2QwMzBiYzNmMGUzM2I0NWJjYTlkODljYmJh&blend-x=142&blend-y=491&blend-mode=normal&s=dde9039777fe79f23502aa4783d190e0)
▼(Qiita) Laravel+Socialiteで簡単ソーシャルログイン実装! (テスト付き)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZoPTMzNiZ0eHQ9TGFyYXZlbCUyQlNvY2lhbGl0ZSVFMyU4MSVBNyVFNyVCMCVBMSVFNSU4RCU5OCVFMyU4MiVCRCVFMyU4MyVCQyVFMyU4MiVCNyVFMyU4MyVBMyVFMyU4MyVBQiVFMyU4MyVBRCVFMyU4MiVCMCVFMyU4MiVBNCVFMyU4MyVCMyVFNSVBRSU5RiVFOCVBMyU4NSUyMSUyMCUyOCVFMyU4MyU4NiVFMyU4MiVCOSVFMyU4MyU4OCVFNCVCQiU5OCVFMyU4MSU4RCUyOSZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnR4dC1jbGlwPWVsbGlwc2lzJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9NzFjMGQyYzE4YjhhY2Q2OTMwNGYyZjNjZWM5NTZhYjE&mark-x=142&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwS2Vpc3VrZUt1ZG8mdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPWEwMWE0NjUyMDRiMzY1MWE0YWYyZTIzNDYzNDRiN2Y2&blend-x=142&blend-y=491&blend-mode=normal&s=fd561fce7738b9100b2396d973101f53)
コメント