Laravel API/Passport集成Socialite Facebook登录报错排查
Laravel API 第三方登录:Facebook 登录报错排查
问题背景
在Laravel API中使用Passport和Socialite实现第三方登录功能,Google登录运行正常,但访问/api/auth/login/facebook时,Facebook返回“Sorry, something went wrong.”错误。已确认Facebook开发者后台的App ID和App Secret正确,但未配置Valid OAuth Redirect URIs(误以为localhost会被自动允许)。
相关代码
api.php
Route::middleware('api')->group(function () { Route::group(['prefix' => 'auth'], function () { Route::post('register', [RegisterController::class, 'register']); Route::post('login', [LoginController::class, 'login']); //Social Login Route::get('login/google', [LoginController::class, 'redirectToGoogle']); Route::get('login/google/callback', [LoginController::class, 'handleGoogleCallback']); Route::get('login/facebook', [LoginController::class, 'redirectToFacebook']); Route::get('login/facebook/callback', [LoginController::class, 'handleFacebookCallback']); Route::group(['middleware' => 'auth:api'], function() { }); }); });
LoginController.php
<?php namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Validation\ValidationException; use App\Models\User; use Laravel\Socialite\Facades\Socialite; class LoginController extends Controller { public function login(Request $request) { $request->validate([ 'email' => 'required|string|email', 'password' => 'required|string', ]); if (Auth::attempt($request->only('email', 'password'))) { return response()->json([ 'token' => Auth::user()->createToken('UserApp')->accessToken, ]); } throw ValidationException::withMessages([ 'email' => ['The provided credentials are incorrect.'], ]); } protected function _registerOrLoginUser($data) { $user = User::where('email', $data->email)->first(); if (!$user) { $user = new User(); $user->name = $data->name; $user->email = $data->email; $user->provider_id = $data->id; $user->avatar = $data->avatar; $user->save(); } Auth::login($user); } protected function _registerOrLoginUserFacebook($data) { $user = User::where('facebook_id', $data->id)->first(); if (!$user) { $user = new User(); $user->name = $data->name; $user->email = $data->email; $user->facebook_id = $data->id; $user->save(); } Auth::login($user); } // Google Login public function redirectToGoogle() { return Socialite::driver('google')->stateless()->redirect(); } public function handleGoogleCallback() { $user = Socialite::driver('google')->stateless()->user(); $this->_registerOrLoginUser($user); $user = Auth::user(); $accessToken = $user->createToken('UserApp')->accessToken; return response()->json([ 'token' => $accessToken, ]); } // Facebook Login public function redirectToFacebook() { // return Socialite::driver('facebook')->stateless()->redirect(); return Socialite::driver('facebook')->stateless()->redirect()->getTargetUrl(); } public function handleFacebookCallback() { $user = Socialite::driver('facebook')->stateless()->user(); $this->_registerOrLoginUserFacebook($user); $user = Auth::user(); $accessToken = $user->createToken('UserApp')->accessToken; return response()->json([ 'token' => $accessToken, ]); } }
services.php
'google' => [ 'client_id' => env('GOOGLE_CLIENT_ID'), 'client_secret' => env('GOOGLE_CLIENT_SECRET'), 'redirect' => env('GOOGLE_REDIRECT'), ], 'facebook' => [ 'client_id' => env('FACEBOOK_CLIENT_ID'), 'client_secret' => env('FACEBOOK_CLIENT_SECRET'), 'redirect' => env('FACEBOOK_REDIRECT'), ],
.env
GOOGLE_CLIENT_ID=Hidden GOOGLE_CLIENT_SECRET=Hidden GOOGLE_REDIRECT=http://127.0.0.1:8000/api/auth/login/google/callback FACEBOOK_CLIENT_ID=Hidden FACEBOOK_CLIENT_SECRET=Hidden FACEBOOK_REDIRECT=http://127.0.0.1:8000/api/auth/login/facebook/callback
问题根源及解决方案
1. 未配置Valid OAuth Redirect URIs(核心问题)
Facebook不会自动允许localhost或127.0.0.1作为回调地址,必须手动配置:
- 登录Facebook开发者后台,进入目标应用
- 导航到
产品 > Facebook登录 > 设置 - 在
Valid OAuth Redirect URIs字段中添加回调地址:http://127.0.0.1:8000/api/auth/login/facebook/callback - 保存更改,等待几分钟生效
2. 重定向方法写法错误
当前redirectToFacebook方法返回getTargetUrl(),仅输出跳转URL而非执行重定向,导致OAuth流程异常。需改回标准写法:
public function redirectToFacebook() { return Socialite::driver('facebook')->stateless()->redirect(); }
3. 额外检查点
- 确认Facebook应用处于“开发模式”,且测试账号已添加到应用的测试用户列表
- 核对
.env中FACEBOOK_REDIRECT地址与开发者后台配置完全一致(包括协议、域名、端口、路径) - 清除Laravel缓存:执行
php artisan config:clear和php artisan cache:clear,确保配置生效
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

