You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Laravel创建Google/Facebook/邮箱社交登录API(仅API,Postman测试)

Laravel 社交登录API实现方案(Google/Facebook/邮箱登录)

1. 环境初始化与依赖安装

  • 创建Laravel项目:
    composer create-project laravel/laravel social-login-api
    cd social-login-api
    
  • 安装社交登录扩展laravel/socialite:
    composer require laravel/socialite
    
  • 安装API认证扩展laravel/sanctum(用于生成用户访问令牌):
    composer require laravel/sanctum
    php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
    php artisan migrate
    
  • 在app/Http/Kernel.php的api中间件组中添加无状态认证支持:
    'api' => [
        \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
    

2. 社交平台配置

配置.env变量

在项目根目录.env中添加授权信息:

# Google
GOOGLE_CLIENT_ID=你的Google客户端ID
GOOGLE_CLIENT_SECRET=你的Google客户端密钥
GOOGLE_REDIRECT_URI=http://localhost:8000/api/auth/google/callback

# Facebook
FACEBOOK_CLIENT_ID=你的Facebook客户端ID
FACEBOOK_CLIENT_SECRET=你的Facebook客户端密钥
FACEBOOK_REDIRECT_URI=http://localhost:8000/api/auth/facebook/callback

配置services.php

编辑config/services.php,添加驱动配置:

return [
    // ...其他配置
    'google' => [
        'client_id' => env('GOOGLE_CLIENT_ID'),
        'client_secret' => env('GOOGLE_CLIENT_SECRET'),
        'redirect' => env('GOOGLE_REDIRECT_URI'),
    ],
    'facebook' => [
        'client_id' => env('FACEBOOK_CLIENT_ID'),
        'client_secret' => env('FACEBOOK_CLIENT_SECRET'),
        'redirect' => env('FACEBOOK_REDIRECT_URI'),
    ],
];

3. 用户模型扩展

添加社交登录相关字段,生成并执行迁移:

php artisan make:migration add_social_fields_to_users_table

编辑迁移文件:

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('social_id')->nullable();
        $table->string('provider')->nullable();
    });
}

public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropColumn(['social_id', 'provider']);
    });
}

执行迁移:

php artisan migrate

在app/Models/User.php中更新可填充字段:

protected $fillable = [
    'name',
    'email',
    'password',
    'social_id',
    'provider',
];

4. 定义API路由

编辑routes/api.php:

use App\Http\Controllers\AuthController;

Route::post('/auth/login', [AuthController::class, 'login']);
Route::get('/auth/{provider}/url', [AuthController::class, 'getSocialAuthUrl']);
Route::post('/auth/{provider}/callback', [AuthController::class, 'handleSocialCallback']);

5. 编写AuthController逻辑

创建app/Http/Controllers/AuthController.php:

<?php

namespace App\Http\Controllers;

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

class AuthController extends Controller
{
    // 邮箱密码登录
    public function login(Request $request)
    {
        $request->validate([
            'email' => 'required|email',
            'password' => 'required|string',
        ]);

        if (!Auth::attempt($request->only('email', 'password'))) {
            return response()->json(['message' => '邮箱或密码错误'], 401);
        }

        $user = Auth::user();
        $token = $user->createToken('auth_token')->plainTextToken;

        return response()->json([
            'user' => $user,
            'token' => $token,
            'token_type' => 'Bearer'
        ]);
    }

    // 获取社交平台授权URL
    public function getSocialAuthUrl($provider)
    {
        if (!in_array($provider, ['google', 'facebook'])) {
            return response()->json(['message' => '不支持的登录方式'], 400);
        }

        $url = Socialite::driver($provider)->stateless()->redirect()->getTargetUrl();
        return response()->json(['auth_url' => $url]);
    }

    // 处理社交平台回调,生成令牌
    public function handleSocialCallback($provider, Request $request)
    {
        if (!in_array($provider, ['google', 'facebook'])) {
            return response()->json(['message' => '不支持的登录方式'], 400);
        }

        $socialUser = Socialite::driver($provider)->stateless()->userFromToken($request->code);

        // 查找或创建用户
        $user = User::updateOrCreate(
            [
                'provider' => $provider,
                'social_id' => $socialUser->id,
            ],
            [
                'name' => $socialUser->name,
                'email' => $socialUser->email,
                'password' => Hash::make(uniqid()), // 生成随机密码,社交登录用户无需密码
            ]
        );

        $token = $user->createToken('auth_token')->plainTextToken;

        return response()->json([
            'user' => $user,
            'token' => $token,
            'token_type' => 'Bearer'
        ]);
    }
}

6. Postman测试步骤

邮箱登录测试

  • 请求方式:POST
  • 地址:http://localhost:8000/api/auth/login
  • Body(raw/json):
    {
        "email": "你的测试邮箱",
        "password": "你的测试密码"
    }
    
  • 响应:返回用户信息和Bearer令牌

Google登录测试

  1. 获取授权URL:
    • 请求方式:GET
    • 地址:http://localhost:8000/api/auth/google/url
    • 响应:拿到auth_url,复制到浏览器打开,完成授权后地址栏会返回code参数
  2. 换取令牌:
    • 请求方式:POST
    • 地址:http://localhost:8000/api/auth/google/callback
    • Body:
      {
          "code": "浏览器地址栏拿到的code"
      }
      
    • 响应:返回用户信息和Bearer令牌

Facebook登录测试

步骤同Google登录,替换路由中的google为facebook即可。

注意事项

  • 确保社交平台开发者后台配置的回调地址与.env中的REDIRECT_URI完全一致
  • 生产环境需关闭调试模式,配置正确的域名和SSL证书
  • 社交登录用户的密码为随机生成,如需支持密码登录可额外添加重置密码逻辑

内容的提问来源于stack exchange,提问作者user14988284

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:35:16