基于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登录测试
- 获取授权URL:
- 请求方式:GET
- 地址:
http://localhost:8000/api/auth/google/url - 响应:拿到
auth_url,复制到浏览器打开,完成授权后地址栏会返回code参数
- 换取令牌:
- 请求方式:POST
- 地址:
http://localhost:8000/api/auth/google/callback - Body:
{ "code": "浏览器地址栏拿到的code" } - 响应:返回用户信息和Bearer令牌
Facebook登录测试
步骤同Google登录,替换路由中的google为facebook即可。
注意事项
- 确保社交平台开发者后台配置的回调地址与
.env中的REDIRECT_URI完全一致 - 生产环境需关闭调试模式,配置正确的域名和SSL证书
- 社交登录用户的密码为随机生成,如需支持密码登录可额外添加重置密码逻辑
内容的提问来源于stack exchange,提问作者user14988284
相关产品推荐
相关产品推荐

