Laravel Socialite 实现第三方登录需配置驱动、处理重定向与回调;GitHub 开箱即用,微信需手动适配授权URL、token换取及用户信息获取流程。
使用 Laravel Socialite 实现第三方登录,核心是配置驱动、处理重定向和回调逻辑。微信和 GitHub 都支持 OAuth2,但细节有差异——GitHub 官方支持开箱即用,微信(尤其是国内微信网页授权)需额外处理域名、scope 和 token 换取方式。
Socialite 是 Laravel 官方维护的 OAuth 库,先安装并发布配置:
providers 数组中添加:Laravel\Socialite\SocialiteServiceProvider::class
aliases 中添加:'Socialite' => Laravel\Socialite\Facades\Socialite::class
config/services.php
然后在 config/services.php 中填写凭证:
'github' => [
'client_id' => env('GITHUB_CLIENT_ID'),
'client_secret' => env('GITHUB_CLIENT_SECRET'),
'redirect' => 'https://yoursite.com/login/github/callback',
],
'wechat' => [
'client_id' => env('WECHAT_APPID'),
'client_secret' => env('WECHAT_SECRET'),
'redirect' => 'https://yoursite.com/login/wechat/callback',
'base_uri' => 'https://api.weixin.qq.com/', // 微信 API 根地址(可选,用于自定义)
],
注意:微信不被 Socialite 原生支持,需手动扩展或使用社区适配器(如 overtrue/laravel-socialite-wechat),下文以“手动兼容方式”说明关键点。
定义两个路由:跳转授权页 + 接收回调。推荐统一前缀便于管理:
Route::prefix('login')->group(function () {
Route::get('/github', [SocialLoginController::class, 'redirectToGithub']);
Route::get('/github/callback', [SocialLoginController::class, 'handleGithubCallback']);
Route::get('/wechat', [SocialLoginController::class, 'redirectToWechat']);
Route::get('/wechat/callback', [SocialLoginController::class, 'handleWechatCallback']);
});
在控制器中,redirectToXxx() 方法调用 Socialite::driver('xxx')->redirect() 即可发起授权请求。
⚠️ 微信特殊点:
– 网页授权需提前在公众号后台配置「授权回调域名」(不能带 http/https 和端口);
– 推荐使用 snsapi_userinfo scope 获取用户信息(需用户同意),snsapi_base 只能拿 openid(静默授权)。
回调方法中,用 Socialite::driver('xxx')->user() 获取用户资料。GitHub 返回标准字段(id, name, email 等),微信返回结构不同:
$user->getId(), $user->getName(), $user->getEmail()
$user->getId() 是 openid,$user->getNickname() 是昵称,$user->getAvatar() 是头像 URL;没有 email 字段,需自行设为 null 或生成唯一邮箱(如 openid@wechat.example)典型处理逻辑:
Auth::login($user, true)
示例片段(简化):
public function handleGithubCallback()
{
$githubUser = Socialite::driver('github')->user();
$user = User::firstOrCreate(
['github_id' => $githubUser->getId()],
[
'name' => $githubUser->getName(),
'email' => $githubUser->getEmail(),
'avatar' => $githubUser->getAvatar(),
]
);
Auth::login($user, true);
return redirect()->intended('/dashboard');
}
如果不想引入额外包,可临时用 Socialite 的通用 OAuth2 支持对接微信:
config/services.php 中配置 wechat 时,把 client_id 和 client_secret 写对https://open.weixin.qq.com/connect/oauth2/authorize?appid={APPID}&redirect_uri={REDIRECT_URI}&response_type=code&scope=snsapi_userinfo&state=xyz#wechat_redirect
https://api.weixin.qq.com/sns/oauth2/access_token?appid={APPID}&secret={SECRET}&code={CODE}&grant_type=authorization_code
https://api.weixin.qq.com/sns/userinfo?access_token={ACCESS_TOKEN}&openid={OPENID}
User 对象(或直接用数组处理),后续逻辑复用即可这种写法绕过了 Socialite 的 driver 封装,但更可控,适合微信这类非标准 OAuth 提供商。
基本上就这些。GitHub 登录开箱即用,微信需要多走一两步 HTTP 请求,但逻辑清晰。关键是把平台差异(字段名、必填参数、token 流程)理清楚,剩下的就是用户查库、登录、跳转——不复杂但容易忽略细节。