Documentation Index Fetch the complete documentation index at: https://kawax.biz/llms.txt
Use this file to discover all available pages before exploring further.
Laravel Socialite とは
Laravel Socialite は、OAuth 2.0 を使ったソーシャルログインをシンプルに実装できる公式パッケージです。GitHub、Google、Facebook、X(Twitter)、LinkedIn など主要なプロバイダーに対応しており、複雑な OAuth の実装を数行のコードで済ませることができます。
組み込みでサポートされているプロバイダーは以下のとおりです。
プロバイダー キー名 Bitbucket bitbucketFacebook facebookGitHub githubGitLab gitlabGoogle googleLinkedIn (OpenID) linkedin-openidSlack slack / slack-openidSpotify spotifyTwitch twitchX (Twitter) x
ソーシャルログインのフロー
インストール
Composer でパッケージを追加します。
composer require laravel/socialite
Socialite をメジャーバージョンアップする際は、必ず アップグレードガイド を確認してください。
config/services.php
各プロバイダーのクライアント ID・シークレット・コールバック URL を config/services.php に追加します。
// config/services.php
'github' => [
'client_id' => env ( 'GITHUB_CLIENT_ID' ),
'client_secret' => env ( 'GITHUB_CLIENT_SECRET' ),
'redirect' => env ( 'GITHUB_REDIRECT_URI' ),
],
'google' => [
'client_id' => env ( 'GOOGLE_CLIENT_ID' ),
'client_secret' => env ( 'GOOGLE_CLIENT_SECRET' ),
'redirect' => env ( 'GOOGLE_REDIRECT_URI' ),
],
'facebook' => [
'client_id' => env ( 'FACEBOOK_CLIENT_ID' ),
'client_secret' => env ( 'FACEBOOK_CLIENT_SECRET' ),
'redirect' => env ( 'FACEBOOK_REDIRECT_URI' ),
],
redirect オプションに相対パスを指定すると、自動的に完全な URL に解決されます。
.env
環境変数でクレデンシャルを管理します。GitHub を例に示します。
GITHUB_CLIENT_ID =your-client-id
GITHUB_CLIENT_SECRET =your-client-secret
GITHUB_REDIRECT_URI =https://example.com/auth/github/callback
GitHub の場合、GitHub Developer Settings で OAuth App を作成するとクライアント ID とシークレットを取得できます。
認証フロー
ルーティング
OAuth 認証には2つのルートが必要です。リダイレクト用とコールバック用です。
use Laravel\Socialite\Facades\ Socialite ;
// ユーザーを GitHub にリダイレクト
Route :: get ( '/auth/github' , function () {
return Socialite :: driver ( 'github' ) -> redirect ();
});
// GitHub からのコールバックを処理
Route :: get ( '/auth/github/callback' , function () {
$user = Socialite :: driver ( 'github' ) -> user ();
// $user->token でアクセストークンを取得
});
ユーザーの保存とログイン
コールバックルートでユーザー情報を取得し、データベースに保存してからログインします。
use App\Models\ User ;
use Illuminate\Support\Facades\ Auth ;
use Laravel\Socialite\Facades\ Socialite ;
Route :: get ( '/auth/github/callback' , function () {
$githubUser = Socialite :: driver ( 'github' ) -> user ();
$user = User :: updateOrCreate (
[ 'github_id' => $githubUser -> id ],
[
'name' => $githubUser -> name ,
'email' => $githubUser -> email ,
'github_token' => $githubUser -> token ,
'github_refresh_token' => $githubUser -> refreshToken ,
]
);
Auth :: login ( $user );
return redirect ( '/dashboard' );
});
updateOrCreate を使う場合、github_id カラムが users テーブルに存在している必要があります。後述のマイグレーション例を参考にしてください。
ユーザー情報の取得
user() メソッドが返すオブジェクトから、以下のプロパティ・メソッドでユーザー情報を取得できます。
Route :: get ( '/auth/github/callback' , function () {
$user = Socialite :: driver ( 'github' ) -> user ();
// OAuth 2.0 プロバイダー
$token = $user -> token ;
$refreshToken = $user -> refreshToken ;
$expiresIn = $user -> expiresIn ;
// OAuth 1.0 プロバイダー (X など)
$token = $user -> token ;
$tokenSecret = $user -> tokenSecret ;
// 全プロバイダー共通
$user -> getId ();
$user -> getNickname ();
$user -> getName ();
$user -> getEmail ();
$user -> getAvatar ();
});
アクセストークンからユーザーを取得
既存のアクセストークンからユーザー情報を取得する場合は userFromToken() を使います。
$user = Socialite :: driver ( 'github' ) -> userFromToken ( $token );
ステートレスモード
Cookie セッションを使わない API では stateless() メソッドでセッション状態の検証を無効化できます。
return Socialite :: driver ( 'google' ) -> stateless () -> user ();
データベース連携
マイグレーション
users テーブルにソーシャルログイン用のカラムを追加します。
// database/migrations/xxxx_xx_xx_add_github_columns_to_users_table.php
return new class extends Migration
{
public function up () : void
{
Schema :: table ( 'users' , function ( Blueprint $table ) {
$table -> string ( 'github_id' ) -> nullable () -> unique () -> after ( 'id' );
$table -> string ( 'github_token' ) -> nullable () -> after ( 'github_id' );
$table -> string ( 'github_refresh_token' ) -> nullable () -> after ( 'github_token' );
});
}
public function down () : void
{
Schema :: table ( 'users' , function ( Blueprint $table ) {
$table -> dropColumn ([ 'github_id' , 'github_token' , 'github_refresh_token' ]);
});
}
};
provider カラムで複数プロバイダーに対応
複数のプロバイダーをまとめて管理する場合は provider / provider_id の2カラム構成が一般的です。
Schema :: table ( 'users' , function ( Blueprint $table ) {
$table -> string ( 'provider' ) -> nullable () -> after ( 'id' );
$table -> string ( 'provider_id' ) -> nullable () -> after ( 'provider' );
$table -> string ( 'provider_token' ) -> nullable () -> after ( 'provider_id' );
$table -> unique ([ 'provider' , 'provider_id' ]);
});
コールバック処理はプロバイダー名を動的に渡すようにします。
Route :: get ( '/auth/{provider}/callback' , function ( string $provider ) {
$socialUser = Socialite :: driver ( $provider ) -> user ();
$user = User :: updateOrCreate (
[
'provider' => $provider ,
'provider_id' => $socialUser -> getId (),
],
[
'name' => $socialUser -> getName (),
'email' => $socialUser -> getEmail (),
'provider_token' => $socialUser -> token ,
]
);
Auth :: login ( $user );
return redirect ( '/dashboard' );
});
既存ユーザーとの紐付け
同じメールアドレスを持つ既存ユーザーとアカウントを紐付ける場合は、メールアドレスで検索してからカラムを更新します。
$socialUser = Socialite :: driver ( 'github' ) -> user ();
$user = User :: where ( 'email' , $socialUser -> getEmail ()) -> first ();
if ( $user ) {
// 既存ユーザーに GitHub 情報を紐付け
$user -> update ([
'github_id' => $socialUser -> getId (),
'github_token' => $socialUser -> token ,
]);
} else {
// 新規ユーザーとして作成
$user = User :: create ([
'name' => $socialUser -> getName (),
'email' => $socialUser -> getEmail (),
'github_id' => $socialUser -> getId (),
'github_token' => $socialUser -> token ,
]);
}
Auth :: login ( $user );
スコープとオプション
スコープの追加
scopes() メソッドで追加のスコープを指定できます。
return Socialite :: driver ( 'github' )
-> scopes ([ 'read:user' , 'public_repo' ])
-> redirect ();
setScopes() メソッドを使うと、既存のスコープをすべて上書きします。
return Socialite :: driver ( 'github' )
-> setScopes ([ 'read:user' , 'public_repo' ])
-> redirect ();
オプションパラメータ
with() メソッドで追加パラメータをリダイレクトリクエストに含めます。
// Google でホスト制限を指定
return Socialite :: driver ( 'google' )
-> with ([ 'hd' => 'example.com' ])
-> redirect ();
// Google で毎回同意画面を表示
return Socialite :: driver ( 'google' )
-> with ([ 'prompt' => 'consent' ])
-> redirect ();
with() メソッドで state や response_type などの予約済みキーワードを渡さないように注意してください。
Slack Bot トークン
Slack Bot トークンを生成する場合は asBotUser() を使います。
// リダイレクト時
return Socialite :: driver ( 'slack' )
-> asBotUser ()
-> setScopes ([ 'chat:write' , 'chat:write.public' , 'chat:write.customize' ])
-> redirect ();
// コールバック時
$user = Socialite :: driver ( 'slack' ) -> asBotUser () -> user ();
テスト
Socialite はテスト用のモック機能を提供しています。実際のプロバイダーへのリクエストなしに OAuth フローをテストできます。
リダイレクトのテスト
use Laravel\Socialite\Facades\ Socialite ;
test ( 'ユーザーがGitHubにリダイレクトされる' , function () {
Socialite :: fake ( 'github' );
$response = $this -> get ( '/auth/github' );
$response -> assertRedirect ();
});
コールバックのテスト
fake() メソッドにユーザーインスタンスを渡して、プロバイダーから返ってくるユーザー情報をモックします。
use Laravel\Socialite\Facades\ Socialite ;
use Laravel\Socialite\Two\ User ;
test ( 'GitHubでログインできる' , function () {
Socialite :: fake ( 'github' , ( new User ) -> map ([
'id' => 'github-123' ,
'name' => 'Jane Doe' ,
'email' => '[email protected] ' ,
]));
$response = $this -> get ( '/auth/github/callback' );
$response -> assertRedirect ( '/dashboard' );
$this -> assertDatabaseHas ( 'users' , [
'name' => 'Jane Doe' ,
'email' => '[email protected] ' ,
'github_id' => 'github-123' ,
]);
});
トークンなど追加のプロパティを設定することもできます。
$fakeUser = ( new User ) -> map ([
'id' => 'github-123' ,
'name' => 'Jane Doe' ,
'email' => '[email protected] ' ,
]) -> setToken ( 'fake-token' )
-> setRefreshToken ( 'fake-refresh-token' )
-> setExpiresIn ( 3600 )
-> setApprovedScopes ([ 'read:user' , 'public_repo' ]);
カスタムプロバイダーの作り方
組み込みプロバイダー以外を使いたい場合、Socialite::extend() でカスタムドライバーを登録するのが公式の正規の方法です。SocialiteManager は Illuminate\Support\Manager を継承しているため、他の Laravel ドライバーシステムと同じ仕組みで拡張できます。
1. プロバイダークラスを作成する
Laravel\Socialite\Two\AbstractProvider を継承し、4つの抽象メソッドを実装します。
// app/Socialite/ExampleProvider.php
namespace App\Socialite ;
use Laravel\Socialite\Two\ AbstractProvider ;
use Laravel\Socialite\Two\ User ;
class ExampleProvider extends AbstractProvider
{
// 認可 URL (ユーザーをリダイレクトする先)
public function getAuthUrl ( $state ) : string
{
return $this -> buildAuthUrlFromBase ( 'https://example.com/oauth/authorize' , $state );
}
// アクセストークン取得 URL
protected function getTokenUrl () : string
{
return 'https://example.com/oauth/token' ;
}
// アクセストークンでユーザー情報を取得する
protected function getUserByToken ( $token ) : array
{
$response = $this -> getHttpClient () -> get ( 'https://example.com/api/user' , [
'headers' => [ 'Authorization' => 'Bearer ' . $token ],
]);
return json_decode ( $response -> getBody (), true );
}
// 取得した配列を Socialite の User オブジェクトにマッピング
protected function mapUserToObject ( array $user ) : User
{
return ( new User ) -> setRaw ( $user ) -> map ([
'id' => $user [ 'id' ],
'nickname' => $user [ 'login' ] ?? null ,
'name' => $user [ 'name' ],
'email' => $user [ 'email' ],
'avatar' => $user [ 'avatar_url' ] ?? null ,
]);
}
}
実装が必要な4つのメソッドの役割は以下のとおりです。
メソッド 役割 getAuthUrl($state)ユーザーをリダイレクトする OAuth 認可 URL を返す getTokenUrl()認可コードをアクセストークンに交換するエンドポイント getUserByToken($token)アクセストークンを使ってユーザー情報 API を叩き、配列で返す mapUserToObject(array $user)取得した配列を Socialite の User オブジェクトに変換する
2. サービスプロバイダーで登録する
AppServiceProvider の boot() メソッドで Socialite::extend() を使ってドライバーを登録します。
// app/Providers/AppServiceProvider.php
use App\Socialite\ ExampleProvider ;
use Laravel\Socialite\Facades\ Socialite ;
public function boot () : void
{
Socialite :: extend ( 'example' , function ( $app ) {
$config = $app [ 'config' ][ 'services.example' ];
return Socialite :: buildProvider ( ExampleProvider :: class , $config );
});
}
3. 設定を追加する
// config/services.php
'example' => [
'client_id' => env ( 'EXAMPLE_CLIENT_ID' ),
'client_secret' => env ( 'EXAMPLE_CLIENT_SECRET' ),
'redirect' => env ( 'EXAMPLE_REDIRECT_URI' ),
],
4. 通常の Socialite と同じように使う
登録後は組み込みプロバイダーとまったく同じ API で使えます。
// リダイレクト
Route :: get ( '/auth/example' , function () {
return Socialite :: driver ( 'example' ) -> redirect ();
});
// コールバック
Route :: get ( '/auth/example/callback' , function () {
$user = Socialite :: driver ( 'example' ) -> user ();
});
extend() を使って正規の方法で Socialite を拡張しているサードパーティパッケージを利用するのもおすすめです。
関連パッケージ
当サイトのオーナーが公開している Socialite 拡張パッケージです。いずれも Socialite::extend() を使った正規の方法で実装されており、config/services.php に設定を追加するだけで使えます。
LINE LINE SDK for Laravel。Socialite による OAuth ログインに加え、Messaging API も統合。
Bluesky AT Protocol (Bluesky) との連携。OAuth 認証とポスト送信をサポート。
Discord Discord OAuth2 ログイン。
Threads Meta Threads との連携。OAuth 認証と投稿 API をサポート。
Amazon Login with Amazon による OAuth ログイン。
Mastodon Mastodon インスタンスへの OAuth ログイン。
WordPress WordPress.com およびセルフホスト WordPress への OAuth ログイン。