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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 22:49:56