Почему логин с фейсбука не работает? (Как отладить эту проблему, кроме проверки URL-адресов?)

У меня есть код ниже, чтобы войти через Facebook. Но это не работает, это показывает:

“Can't Load URL: The domain of this URL isn't
  included in the App's domains. To be able to 
    load this URL, add all domains and subdomains of your app to the
   App Domains field in your app settings."

Но URL был определен.

Маршруты:

Route::get('auth/{provider}', [
    'uses' => 'OauthController@redirectToProvider',
    'as' => 'social.auth'
]);

Route::get('auth/{provider}/callback', [
    'uses' => 'OauthController@handleProviderCallback',
]);

services.php:

'facebook' => [
        'client_id' => '...',
        'client_secret' => '...',
        'redirect' => 'https://....ngrok.io/auth/facebook/callback'
    ]

OauthController:

class OauthController extends Controller
{

    public function redirectToProvider($provider)
    {
        return Socialite::driver($provider)->redirect();

    }


    public function handleProviderCallback($provider)
    {
        $userFace = Socialite::driver($provider)->user();
        // $user->token;

        $findUser = User::where('email', $userFace->email)->first();

        if($findUser){
            Auth::login($findUser);
        }else{
            $user = new User;
            $user->name = $userFace->name;
            $user->surname = "";
            $user->email = $userFace->email;
            $user->password = bcrypt($user->name);
            $user->save();
            Auth::login($user);
        }
    }
}

Я изменяю некоторые конфигурации, и теперь появляется другая ошибка. Пользователь нажимает кнопку "Войти через Facebook" и перенаправляется на страницу Facebook, после чего необходимо ввести пароль. После ввода пароля пользователь перенаправляется на " https:/auth/facebook/callback?code=...&state=..." и появляется страница с:

Laravel \ Socialite \ Two \ InvalidStateException
No message

Эта ошибка в файле /socialite/src/Two/AbstractProvider.php в "public function user() { if ($this->hasInvalidState()) { throw new InvalidStateException;}... "

Конфигурации:

Конфигурации Laravel:

In services.php
    'redirect' => 'https://....ngrok.io/facebook/auth/callback'

In .env file:
    APP_URL=https://....ngrok.io

Настройки Facebook:

Client OAuth Login - yes
Web OAuth login - yes
Force Web OAuth Reauthentication - yes
Use Strict Mode for Redirect URIs - yes
Enforce HTTPS - No
Embedded Browser OAuth Login - No

Valid OAuth Redirect URIs: https://....ngrok.io/facebook/auth/callback

Basic settings: 
    App domains: ....ngrok.io
    Site URL: https://....ngrok.io/facebook/callback

Если я использую localhost, это работает.

С "'redirect' => 'proj.test/auth/facebook/callback'";.

И в настройках фейсбука:

URL сайта: proj.test / auth / facebook / callback

Домены приложения: proj.test

Действительные URI перенаправления OAuth proj.test / auth / facebook / callback '"

Однако он не работает должным образом, пользователь перенаправляется на "proj.test/auth/facebook/callback? Code =......="; он вставляется в БД, но вместо пользователя отображается пустая страница. перенаправлен на "proj.test".

3 ответа

Я рекомендую вам настроить на свой проект XDEBUG. Тогда вы сможете ставить точки останова в своем проекте, и вы будете знать, что происходит.

Вы можете легко найти инструкцию по установке XDEBUG для вашей среды. Вот хороший пример: Установка Xdebug на Homestead 7.0, PHP 7.2

public function providerToFaceBook(){
    return Socialite::driver('facebook')->redirect();
}

public function handleFacebookCallback(Request $request){
    $AccessToken = Socialite::driver('facebook')->getAccessTokenResponse($request->code);
    if($token = $AccessToken['access_token']){
        $facebook = Socialite::driver('facebook')->userFromToken($token);
            if($facebook->id){
                $FacebookSql = User::where('social_unique_id',$facebook->id);
                if($facebook->email !=""){
                    $FacebookSql->orWhere('email',$facebook->email);
                }
                $AuthUser = $FacebookSql->first();
                if($AuthUser){
                    $AuthUser->social_unique_id=$facebook->id;
                    $AuthUser->save();
                    Auth::loginUsingId($AuthUser->id);
                    return redirect('/');
                }else{   
                    $new=new User();
                    $new->email=$facebook->email;
                    $name = explode(' ', $facebook->name, 2);
                    $new->first_name=$name[0];
                    $new->last_name= isset($name[1]) ? $name[1] : '';
                    $new->password=bcrypt($facebook->id);
                    $new->social_unique_id=$facebook->id;
                    //$new->mobile=$facebook->mobile;
                    $new->picture=$facebook->avatar;
                    $new->login_by="facebook";
                    $new->save();
                    Auth::loginUsingId($new->id);
                    return redirect('/');
                }
            }else{
                return redirect('/');
            }
    }else{
       return redirect()->to('/');
    }
}

Facebook не принимает маршруты localhost для перенаправления. Если вы попытаетесь поместить URL-адрес перенаправления в консоль API api, это вернет ошибку, вы должны проверить это в среде разработки или производства с реальным URL-адресом.

Другие вопросы по тегам