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');
});