это код, который я использую для стороннего проекта в PROD.До сих пор работает без каких-либо проблем.
Я надеюсь, что это поможет вам сделать эту сложную вещь: D, как вы можете видеть, это проще, чем кажется.
Ошибка может заключаться в том, что вы настраиваете свои маршруты для обработки аутентификации и обратного вызова, для меня кажется, что у вас есть один и тот же маршрут для обоих и таким образом, когда Facebook одобряет и отправляет пользователя обратноваш веб-сайт снова перенаправляется на конечную точку OAuth и т. д.
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Response;
use Laravel\Socialite\Facades\Socialite;
class LoginController extends Controller
{
/**
* Redirect the user to the GitHub authentication page.
*
* @param $provider
* @return Response
*/
public function redirectToProvider($provider)
{
return Socialite::driver($provider)->redirect();
}
/**
* Obtain the user information from GitHub.
*
* @param $provider
* @return Response
*/
public function handleProviderCallback($provider)
{
$user = Socialite::driver($provider)->user();
$authUser = $this->findOrCreateUser($user, $provider);
auth()->login($authUser, true);
return redirect('/home');
}
/**
* Finds or creates an user.
*
* @param $user
* @param $provider
* @return mixed
*/
public function findOrCreateUser($user, $provider)
{
$authUser = User::where('provider_id', $user->id)->first();
if ($authUser) {
return $authUser;
}
return User::create([
'name' => $user->name,
'email' => $user->email,
'provider' => $provider,
'provider_id' => $user->id,
]);
}
}
И вот как мы настраиваем наши службы ( вместо env, вы также можете использовать функцию маршрута ).
<?php
return [
/*
|--------------------------------------------------------------------------
| Third Party Services
|--------------------------------------------------------------------------
|
| This file is for storing the credentials for third party services such
| as Stripe, Mailgun, SparkPost and others. This file provides a sane
| default location for this type of information, allowing packages
| to have a conventional place to find your various credentials.
|
*/
'twitter' => [
'client_id' => env('TWITTER_CLIENT_ID', ''),
'client_secret' => env('TWITTER_CLIENT_SECRET', ''),
'redirect' => env('APP_URL', '').'/auth/twitter/callback',
],
'facebook' => [
'client_id' => env('FACEBOOK_CLIENT_ID', ''),
'client_secret' => env('FACEBOOK_CLIENT_SECRET', ''),
'redirect' => env('APP_URL', '').'/auth/facebook/callback',
],
'google' => [
'client_id' => env('GOOGLE_CLIENT_ID', ''),
'client_secret' => env('GOOGLE_CLIENT_SECRET', ''),
'redirect' => env('APP_URL', '').'/auth/google/callback',
],
];
//Routes for socialite
Route::get('auth/{provider}', 'LoginController@redirectToProvider');
Route::get('auth/{provider}/callback', 'LoginController@handleProviderCallback');