Laravel 12 实现 OAuth2 登录

Laravel 12 实现 OAuth2 登录

在 Laravel 12 中实现 OAuth2 登录,你可以使用 Laravel 官方提供的 Socialite 包。以下是完整实现步骤:

1. 安装 Socialite

首先通过 Composer 安装 Socialite:

复制代码
composer require laravel/socialite

2. 配置服务提供者

在 config/app.php 的 providers 数组中添加:

复制代码
Laravel\Socialite\SocialiteServiceProvider::class,

并在 aliases 数组中添加:

复制代码
'Socialite' => Laravel\Socialite\Facades\Socialite::class,

3. 配置 OAuth2 服务

在 config/services.php 中添加你的 OAuth2 服务配置,例如 GitHub:

复制代码
'github' => [
    'client_id' => env('GITHUB_CLIENT_ID'),
    'client_secret' => env('GITHUB_CLIENT_SECRET'),
    'redirect' => env('GITHUB_REDIRECT_URI'),
],

4. 设置环境变量

在 .env 文件中添加:

复制代码
GITHUB_CLIENT_ID=your-client-id
GITHUB_CLIENT_SECRET=your-client-secret
GITHUB_REDIRECT_URI=http://your-app.com/auth/github/callback

5. 创建路由

在 routes/web.php 中添加:

复制代码
use Laravel\Socialite\Facades\Socialite;

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

Route::get('/auth/github/callback', function () {
    $user = Socialite::driver('github')->user();
    
    // 处理用户登录或注册逻辑
    // $user->getId();
    // $user->getNickname();
    // $user->getName();
    // $user->getEmail();
    // $user->getAvatar();
    
    // 示例:查找或创建用户
    $authUser = User::updateOrCreate([
        'github_id' => $user->id,
    ], [
        'name' => $user->name,
        'email' => $user->email,
        'github_token' => $user->token,
        'github_refresh_token' => $user->refreshToken,
    ]);
    
    Auth::login($authUser);
    
    return redirect('/dashboard');
});

6. 创建用户模型迁移

确保你的 users 表有存储 OAuth2 信息的字段:

复制代码
php artisan make:migration add_github_columns_to_users_table --table=users

在迁移文件中:

复制代码
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('github_id')->nullable();
        $table->string('github_token')->nullable();
        $table->string('github_refresh_token')->nullable();
    });
}

7. 修改用户模型

在 app/Models/User.php 中添加:

复制代码
protected $fillable = [
    'name', 'email', 'password', 
    'github_id', 'github_token', 'github_refresh_token'
];

8. 其他 OAuth2 服务

如果你想使用其他服务如 Google、Facebook 等,步骤类似:

在 config/services.php 中添加配置

在 .env 中添加对应环境变量

创建对应的路由和回调处理

例如 Google 登录:

复制代码
'google' => [
    'client_id' => env('GOOGLE_CLIENT_ID'),
    'client_secret' => env('GOOGLE_CLIENT_SECRET'),
    'redirect' => env('GOOGLE_REDIRECT_URI'),
],

9. 自定义用户处理逻辑

你可以创建一个服务类来处理用户查找和创建逻辑:

复制代码
namespace App\Services;

use App\Models\User;
use Laravel\Socialite\Contracts\User as ProviderUser;

class SocialAccountService
{
    public function findOrCreate(ProviderUser $providerUser, string $provider)
    {
        $account = User::where($provider.'_id', $providerUser->getId())->first();
        
        if ($account) {
            return $account;
        }
        
        $account = User::where('email', $providerUser->getEmail())->first();
        
        if ($account) {
            $account->update([$provider.'_id' => $providerUser->getId()]);
        } else {
            $account = User::create([
                'email' => $providerUser->getEmail(),
                'name' => $providerUser->getName(),
                $provider.'_id' => $providerUser->getId(),
            ]);
        }
        
        return $account;
    }
}

然后在回调中使用:

复制代码
Route::get('/auth/{provider}/callback', function ($provider) {
    $user = Socialite::driver($provider)->user();
    $authUser = (new SocialAccountService())->findOrCreate($user, $provider);
    Auth::login($authUser, true);
    return redirect('/home');
});

10. 注意事项

确保你的回调 URL 在 OAuth2 服务提供商处正确配置

处理用户可能拒绝授权的情况

考虑添加 CSRF 保护

对于生产环境,使用 HTTPS

相关推荐
TlSfoward14 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
—Miss. Z—17 小时前
计算机二级MySQL——简单应用题(存储过程&存储函数)
数据库·oracle·php
故乡de云17 小时前
AWS 添加付款方式失败排查清单:卡片、银行风控与账号状态逐项定位
开发语言·php
梦梦代码精18 小时前
基于ThinkPHP6 + Vue3的家政预约系统全解析:从LBS定位到自动派单的完整实现
java·docker·开源·php·代码规范
郑州光合科技余经理19 小时前
家政O2O平台解析:从0搭建上门预约小程序解决方案
android·java·开发语言·前端·小程序·架构·php
lxw184491251420 小时前
PHP后端(CI框架方向)面试题库,分为基础必问、MySQL、Redis、工程运维、高阶加分、场景实操六大模块,适配该JD全部考点,附带标准答案
ci/cd·面试·php
郑州光合科技余经理20 小时前
家政预约小程序后端源码深度剖析:支付回调实战
java·开发语言·前端·git·小程序·架构·php
weixin_408099671 天前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
王莎莎-MinerU2 天前
MCP 解决的是工具接入,科研 Agent 还缺的是科学证据接口标准化
开发语言·网络·人工智能·深度学习·pdf·c#·php
AC赳赳老秦2 天前
OpenClaw 采集任务日志审计:全程记录采集行为,满足合规溯源与企业审计要求
java·大数据·python·数据挖掘·数据分析·php·openclaw