Installation:
composer require overtrue/socialite
For Laravel, use overtrue/laravel-socialite for seamless integration.
Basic Configuration:
Define provider configs in an array (e.g., config/socialite.php):
return [
'github' => [
'client_id' => env('GITHUB_CLIENT_ID'),
'client_secret' => env('GITHUB_CLIENT_SECRET'),
'redirect_uri' => env('GITHUB_REDIRECT_URI'),
],
'wechat' => [
'client_id' => env('WECHAT_CLIENT_ID'),
'client_secret' => env('WECHAT_CLIENT_SECRET'),
'redirect_uri' => env('WECHAT_REDIRECT_URI'),
],
];
First Use Case: Redirect a user to GitHub for OAuth:
use Overtrue\Socialite\SocialiteManager;
$socialite = new SocialiteManager(config('socialite'));
$url = $socialite->create('github')->redirect();
return redirect($url);
Handle Callback:
After user authorization, exchange the code for user data:
$code = request()->query('code');
$user = $socialite->create('github')->userFromCode($code);
// Access user data: $user->getEmail(), $user->getName(), etc.
Provider Initialization:
SocialiteManager to manage multiple providers:
$socialite = new SocialiteManager($config);
$github = $socialite->create('github');
Redirect Flow:
$authUrl = $socialite->create('wechat')->redirect();
return redirect($authUrl);
Callback Handling:
code for user data:
$user = $socialite->create('wechat')->userFromCode($code);
User Data Extraction:
$email = $user->getEmail();
$name = $user->getName();
$avatar = $user->getAvatar();
Laravel Integration:
public function handle(Request $request, Closure $next) {
if ($request->has('state') && !hash_equals(session('oauth_state'), $request->state)) {
throw new \Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
}
return $next($request);
}
Custom User Mapping:
$userData = $user->getOriginal();
$yourUser = YourUser::updateOrCreate(
['email' => $userData['email']],
['name' => $userData['name'], 'provider_id' => $user->getId()]
);
Session Persistence:
session(['user' => $yourUser]);
Multi-Provider Logins:
$provider = request()->input('provider'); // e.g., 'github', 'wechat'
$socialite->create($provider)->redirect();
Scoped Access:
$socialite->create('baidu')->scopes(['basic'])->redirect();
Redirect URI Mismatch:
redirect_uri in config matches the callback URL registered in the provider’s dashboard.State Token Validation:
state parameter to prevent CSRF attacks.if (!hash_equals(session('oauth_state'), $request->state)) {
abort(403);
}
Provider-Specific Quirks:
component config for third-party platforms.
'wechat' => [
'client_id' => '...',
'component' => [
'app_id' => env('WECHAT_COMPONENT_APP_ID'),
'token' => env('WECHAT_COMPONENT_TOKEN'),
],
]
openid for userFromToken():
$user = $socialite->create('douyin')->withOpenId($openId)->userFromToken($token);
Token Expiry:
$token = $socialite->create('wechat')->getAccessToken();
Cache::put('wechat_token', $token, now()->addHours(1));
Error Handling:
try {
$user = $socialite->create('github')->userFromCode($code);
} catch (\Overtrue\Socialite\Exceptions\InvalidStateException $e) {
Log::error($e->getMessage());
abort(403);
}
Enable Debug Mode:
debug: true in config to log OAuth requests/responses:
$socialite = new SocialiteManager($config, [
'debug' => true,
]);
Inspect Raw Responses:
$response = $socialite->create('github')->getAccessTokenResponse($code);
dd($response->getBody());
Provider-Specific Logs:
Custom Providers:
ProviderInterface:
class CustomProvider implements \Overtrue\Socialite\Contracts\ProviderInterface {
public function getAuthUrl($state) { ... }
public function getAccessToken($code) { ... }
public function getUserByToken($token) { ... }
}
$socialite->extend('custom', function ($config) {
return new CustomProvider($config);
});
Override User Model:
User class to add provider-specific fields:
class SocialUser extends \Overtrue\Socialite\Providers\User {
public function getProviderId() {
return $this->original['provider_id'] ?? null;
}
}
$socialite->extend('github', function ($config) {
$provider = new \Overtrue\Socialite\Providers\GitHubProvider($config);
$provider->setUserClass(SocialUser::class);
return $provider;
});
Dynamic Config Loading:
$config = [
'github' => [
'client_id' => env('GITHUB_CLIENT_ID'),
// ...
],
];
Rate Limiting:
public function handle($request, Closure $next) {
if ($request->is('socialite/*')) {
$key = $request->ip().'|'.$request->provider;
if (Cache::has($key)) {
abort(429, 'Too many requests');
}
Cache::put($key, true, now()->addMinutes(1));
}
return $next($request);
}
How can I help you explore Laravel packages today?