socialiteproviders/manager
Laravel SocialiteProviders Manager lets you add or override Socialite OAuth providers with deferred loading, easy Lumen support, configurable stateless mode, dynamic config overrides, and direct .env variable retrieval for simpler setup.
composer require socialiteproviders/manager
php artisan vendor:publish --provider="SocialiteProviders\Manager\ManagerServiceProvider"
composer require socialiteproviders/github
config/services.php:
'github' => [
'client_id' => env('GITHUB_CLIENT_ID'),
'client_secret' => env('GITHUB_CLIENT_SECRET'),
'redirect' => env('GITHUB_REDIRECT_URI'),
],
// app/Providers/EventServiceProvider.php
protected $listen = [
\SocialiteProviders\Manager\SocialiteWasCalled::class => [
'App\Providers\GitHubExtendSocialite',
],
];
app/Providers/GitHubExtendSocialite.php):
namespace App\Providers;
use SocialiteProviders\Manager\SocialiteWasCalled;
class GitHubExtendSocialite
{
public function handle(SocialiteWasCalled $socialiteWasCalled)
{
$socialiteWasCalled->extendSocialite('github', \SocialiteProviders\GitHub\GitHubExtendProvider::class);
}
}
$user = Socialite::driver('github')->user();
// routes/web.php
Route::get('/login/github', function () {
return Socialite::driver('github')->redirect();
});
Route::get('/login/github/callback', function () {
$user = Socialite::driver('github')->user();
// Handle user data (e.g., create/update in DB)
return redirect('/dashboard');
});
composer require socialiteproviders/{provider-name}
.env (e.g., TWITTER_CLIENT_ID, TWITTER_CLIENT_SECRET).$user = Socialite::driver('twitter')->user();
facebook).Useful for per-tenant credentials or A/B testing:
$config = new \SocialiteProviders\Manager\Config(
env('TENANT_1_GITHUB_CLIENT_ID'),
env('TENANT_1_GITHUB_CLIENT_SECRET'),
route('tenant-1.github.callback'),
['team_id' => 123] // Additional config
);
return Socialite::driver('github')
->setConfig($config)
->redirect();
Enable for Lumen or high-performance APIs:
// In your listener:
$socialiteWasCalled->setStateless(true);
namespace App\Providers;
use SocialiteProviders\Manager\OAuth2\AbstractProvider;
use Laravel\Socialite\Contracts\User;
class CustomProvider extends AbstractProvider
{
protected $scopes = ['read', 'write'];
protected function getAuthUrl($state)
{
return $this->buildAuthUrlFromBase('https://custom-auth.example.com/oauth/authorize', $state);
}
protected function getTokenUrl()
{
return 'https://custom-auth.example.com/oauth/token';
}
protected function getUserByToken($token)
{
$response = $this->getHttpClient()->get('https://custom-auth.example.com/api/user', [
'headers' => ['Authorization' => 'Bearer ' . $token],
]);
return json_decode($response->getBody(), true);
}
protected function mapUserToObject(array $user)
{
return (new User())->setRaw($user)->map([
'id' => $user['id'],
'nickname' => $user['username'],
'name' => $user['full_name'],
'email' => $user['email'],
]);
}
}
$socialiteWasCalled->extendSocialite('custom', \App\Providers\CustomProvider::class);
For providers needing refresh_token or expires_in:
$user = Socialite::driver('github')->user();
$refreshToken = $user->accessTokenResponseBody['refresh_token'];
Dynamic provider selection based on tenant:
// In your listener:
public function handle(SocialiteWasCalled $socialiteWasCalled)
{
$tenant = Tenant::find(request('tenant_id'));
$providerName = $tenant->auth_provider; // e.g., 'github' or 'gitlab'
$socialiteWasCalled->extendSocialite($providerName, \SocialiteProviders\GitHub\GitHubExtendProvider::class);
}
Listen to SocialiteProviders\Manager\Events\UserFetched:
// app/Providers/EventServiceProvider.php
protected $listen = [
\SocialiteProviders\Manager\Events\UserFetched::class => [
'App\Listeners\UpdateUserFromSocialite',
],
];
// app/Listeners/UpdateUserFromSocialite.php
public function handle(UserFetched $event)
{
$user = $event->user;
$user->setAttribute('custom_field', $user->raw['custom_data']);
}
use SocialiteProviders\Manager\SocialiteWasCalled;
public function handle(SocialiteWasCalled $socialiteWasCalled)
{
logger()->info("Provider called: {$socialiteWasCalled->providerName}");
}
bootstrap/app.php:
$app->register(\SocialiteProviders\Manager\ManagerServiceProvider::class);
$socialiteWasCalled->setStateless(true);
$provider = new \SocialiteProviders\GitHub\GitHubExtendProvider(
new \GuzzleHttp\Client,
new \SocialiteProviders\Manager\Config(
env('GITHUB_CLIENT_ID'),
env('GITHUB_CLIENT_SECRET'),
url('/callback')
)
);
$user = $provider->user();
Provider Not Found
SocialiteWasCalled listener.EventServiceProvider::$listen and the class namespace is correct.Class 'SocialiteProviders\GitHub\GitHubExtendProvider' not found.Double Registration
if (!$socialiteWasCalled->hasProvider('github')) {
$socialiteWasCalled->extendSocialite('github', \SocialiteProviders\GitHub\GitHubExtendProvider::class);
}
Stateless Mode Latency
Environment Variables Not Loaded
.env variables not published or misspelled.php artisan config:clear or verify .env keys match config/services.php.OAuth1 vs. OAuth2 Confusion
AbstractProvider classes (e.g., using OAuth2 for Twitter).How can I help you explore Laravel packages today?