首页 > 解决方案 > Facebook 和 Google 登录的代码无法在实时服务器上运行

问题描述

Laravel 版本:7.9.2 PHP 版本:7.4

我有登录 Facebook 和 Google 的代码。它在本地主机上工作得非常好,但在实时服务器上它不起作用。令人惊讶的是它既不返回任何错误也不抛出任何异常。它只是将用户重定向回登录页面,我的 URL 显示字符串# =。这是实时链接

https://beta.car-chain.net/login

我需要建议。

登录控制器.php

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Support\Facades\Auth;
use Laravel\Socialite\Facades\Socialite;
use App\User;
use Exception;


    class LoginController extends Controller
    {
        use AuthenticatesUsers;

        protected $redirectTo = RouteServiceProvider::HOME;

        public function __construct()
        {
            $this->middleware('guest')->except('logout');
        }

        protected $providers = [
            'github','facebook','google','twitter'
        ];

        public function show()
        {
            return view('auth.login');
        }

        public function redirectToProvider($driver)
        {
            if( ! $this->isProviderAllowed($driver) ) {
                return $this->sendFailedResponse("{$driver} is not currently supported");
            }

            try {
                return Socialite::driver($driver)->redirect();
            } catch (Exception $e) {


                // You should show something simple fail message
                return $this->sendFailedResponse($e->getMessage());
            }
        }


        public function handleProviderCallback( $driver )
        {
            try {
                $user = Socialite::driver($driver)->user();
            } catch (Exception $e) {
                return $this->sendFailedResponse($e->getMessage());
            }

            // check for email in returned user
            return empty( $user->email )
                ? $this->sendFailedResponse("No email id returned from {$driver} provider.")
                : $this->loginOrCreateAccount($user, $driver);
        }

        protected function sendSuccessResponse()
        {
            return redirect()->intended('home');
        }

        protected function sendFailedResponse($msg = null)
        {
            return redirect()->route('social.login')
                ->withErrors(['msg' => $msg ?: 'Unable to login, try with another provider to login.']);
        }

        protected function loginOrCreateAccount($providerUser, $driver)
        {

         // check for already has account
         $user = User::where('email', $providerUser->getEmail())->first();

     // if user already found
             if( $user ) {
                 // update the avatar and provider that might have changed
                 $user->update([
                     'provider' => $driver,
                     'provider_id' => $providerUser->id,
                     'access_token' => $providerUser->token
                 ]);
             } else {
                   if($providerUser->getEmail()){ //Check email exists or not. If exists create a new user
                    $user = User::create([
                       'name' => $providerUser->getName(),
                       'email' => $providerUser->getEmail(),
                       'provider' => $driver,
                       'provider_id' => $providerUser->getId(),
                       'access_token' => $providerUser->token,
                       'password' => '' // user can use reset password to create a password
                 ]);

                  }else{

                 //Show message here what you want to show

                }
           }

           // login the user
             Auth::login($user, true);
             return $this->sendSuccessResponse();
       }

        private function isProviderAllowed($driver)
        {
            return in_array($driver, $this->providers) && config()->has("services.{$driver}");
        }

    }

路由.php

<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');

Route::get('auth/social', 'Auth\LoginController@show')->name('social.login');
Route::get('oauth/{driver}', 'Auth\LoginController@redirectToProvider')->name('social.oauth');
Route::get('oauth/{driver}/callback', 'Auth\LoginController@handleProviderCallback')->name('social.callback');

标签: phplaravellaravel-6laravel-7

解决方案


推荐阅读