Laravel 用 Socialite 接入第三方登录:OAuth 回调与用户自动注册

test12026-11-031 次阅读

为什么用 Socialite

自己对接 OAuth 要走授权码换 token、token 换用户信息、刷新 token 一整套流程,每个平台字段还不一样。Socialite 把这些封装成统一接口:redirect 把用户带到第三方,user 把回调里的信息解析成对象。支持 GitHub、Google、微信等常见 provider,新增一个登录方式基本只改配置。

安装与配置

先装扩展包,再到 services 配置里填各平台的 client id 和 secret,最后在 .env 里放真实凭据。

composer require laravel/socialite
// config/services.php
'github' => [
    'client_id' => env('GITHUB_CLIENT_ID'),
    'client_secret' => env('GITHUB_CLIENT_SECRET'),
    'redirect' => env('GITHUB_REDIRECT_URI'),
],

路由与控制器

两条路由即可:一条把用户重定向出去,一条接收回调。回调里拿到第三方用户对象,再决定是登录还是注册。

use Laravel\Socialite\Facades\Socialite;
use App\Models\User;
use Illuminate\Support\Facades\Auth;

Route::get('/auth/github/redirect', function () {
    return Socialite::driver('github')->redirect();
});

Route::get('/auth/github/callback', function () {
    $githubUser = Socialite::driver('github')->user();

    $user = User::firstOrCreate(
        ['github_id' => $githubUser->getId()],
        [
            'name' => $githubUser->getName() ?? $githubUser->getNickname(),
            'email' => $githubUser->getEmail(),
            'password' => bcrypt(Str::random(24)),
        ]
    );

    Auth::login($user, true);
    return redirect('/dashboard');
});

用户自动注册与账号关联

firstOrCreate 已经处理了"首次自动注册"。如果用户之前用邮箱注册过,可以再加一步:按 email 找到老账号并回填 github_id,把两种登录方式关联到同一个用户,避免重复账号。

$user = User::where('github_id', $githubUser->getId())->first();

if (! $user && $githubUser->getEmail()) {
    $user = User::where('email', $githubUser->getEmail())->first();
    if ($user) {
        $user->github_id = $githubUser->getId();
        $user->save();
    }
}

if (! $user) {
    $user = User::create([
        'github_id' => $githubUser->getId(),
        'name' => $githubUser->getName(),
        'email' => $githubUser->getEmail(),
        'password' => bcrypt(Str::random(24)),
    ]);
}

Auth::login($user, true);

上线前的注意事项

回调地址必须在第三方后台白名单里,本地用 127.0.0.1、线上用真实域名分别配置。部分 provider(如 GitHub)在用户隐藏邮箱时 getEmail 会返回 null,关联逻辑要兼容这种情况。state 参数由 Socialite 自动处理,用于防 CSRF,不要关掉。最后给 User 模型加上 github_id 字段的迁移,并在 $fillable 里放行。

小结

Socialite 把 OAuth 的脏活收进统一接口,接入一个新平台主要是配置加几行回调代码。配合 firstOrCreate 与按 email 关联,既能自动注册新用户,也能把第三方账号并回已有用户,避免一套系统里出现多个重复身份。

T

test1

文章作者

为什么用 Socialite 自己对接 OAuth 要走授权码换 token、token 换用户信息、刷新 token...

分类
技术
发布时间
2026-11-03
字数
约 2251 字
阅读
1 次