【问题标题】:Socialite is not working in Laravel Middleware, How can i resolve this issue?Socialite 不能在 Laravel 中间件中工作,我该如何解决这个问题?
【发布时间】:2020-07-07 11:10:01
【问题描述】:

我正在使用 Socialite 进行 Google 身份验证,我有一个中间件用于检查用户是否通过他们的 google_id 存在于我的本地数据库中,它可以重定向到 /home 页面,否则它将重定向回 Google身份验证页面,在执行此操作时,我遇到了中间问题,错误是:

客户端错误:POST https://www.googleapis.com/oauth2/v4/token 导致 400 Bad Request 响应:{ "error": "invalid_request", "error_description": "Missing required parameter: code" }

中间件

<?php

namespace App\Http\Middleware;
//use Socialite;
use App\GmailAccount;
use Closure;

use Laravel\Socialite\Facades\Socialite;

use Illuminate\Support\Facades\Auth;

class GoogleAuth
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        $user = Socialite::driver('google')->stateless()->user();

        $finduser = GmailAccount::where('google_id', $user->id)->first();

        if($finduser){
            return $next($request);
        }

        else{
            return route('/logingoogle');
        }

    }
}

路线

Route::group(['middleware' => 'App\Http\Middleware\GoogleAuth'], function()
{
    Route::get('/home', 'HomeController@index')->name('home');

});

Route::get('/logingoogle', 'GoogleController@google_login');

Route::get('auth/google', 'GoogleController@redirectToGoogle');

Route::get('auth/google/callback', 'GoogleController@handleGoogleCallback');

家庭控制器

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');

        $this->middleware('googleauth');
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Contracts\Support\Renderable
     */
    public function index()
    {
        $user_id=Auth::user()->id;
        $user_messages=DB::table('user_message')
            ->join('messages', 'user_message.message_id', '=', 'messages.id')
            ->where([
            'user_message.user_id' => $user_id,
            'user_message.placeholder' => 'inbox'
                ])
            ->select('messages.*', 'user_message.message_id', 'user_message.user_id','user_message.is_read')
            ->orderBy('messages.id', 'DESC')

            ->paginate(10);
        return view('website_pages.home',compact('user_messages'));
    }
}

谷歌控制器

class GoogleController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */

    public function __construct()
    {
        $this->middleware('auth');
    }

    public function google_login(){

        return  view('website_pages.login_google');

    }

    public function redirectToGoogle()
    {
        return Socialite::driver('google')->stateless()->redirect();
    }

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function handleGoogleCallback()
    {

            $login_user_id  =  Auth::user()->id;

        try {

            $user = Socialite::driver('google')->stateless()->user();

            $finduser = GmailAccount::where('google_id', $user->id)->first();

            if($finduser){
                return redirect('/home');
            }
            else{
                $newUser = DB::table('gmail_accounts')->updateOrInsert(
                    [
                        'email' => $user->email,
                    ],

                    [
                    'user_id' => $login_user_id,
                     'email' => $user->email,
                    'google_id'=> $user->id,
                    'remember_token'=> $user->token
                ]

                );

                if ($newUser){
                    return redirect('/home');
                }

                else{
                    return redirect()->back();
                }
                Auth::login($newUser, true);
            }

        } catch (Exception $e) {
            dd($e->getMessage());
        }
    }
}

Gmail帐户模型

class GmailAccount extends Model
{
    protected $table = 'gmail_accounts';


    protected $fillable = [
       'email', 'password', 'google_id', 'user_id', 'remember_token'
    ];


    public function user()
    {
        return $this->belongsTo('App\User');
    }
}

【问题讨论】:

    标签: laravel google-oauth laravel-socialite


    【解决方案1】:

    以下是一个工作示例:

    <?php
    
    namespace App\Http\Controllers\Auth;
    
    use App\Http\Controllers\Controller;
    use App\Providers\RouteServiceProvider;
    use Illuminate\Foundation\Auth\AuthenticatesUsers;
    use Socialite;
    use App\User;
    
    class LoginController extends Controller
    {
        use AuthenticatesUsers;
    
        public function redirectToProvider()
        {
            return Socialite::driver('google')->redirect();
        }
    
        public function handleProviderCallback()
        {
            try {
                $user = Socialite::driver('google')->user();
            } catch (\Exception $e) {
                return redirect('/login');
            }
    
            // check if they're an existing user
            $existingUser = User::where('email', $user->email)->first();
    
            if ($existingUser) {
                // log them in
                auth()->login($existingUser, true);
            } else {
                // create a new user
                $newUser                  = new User;
                $newUser->name            = $user->name;
                $newUser->email           = $user->email;
                $newUser->google_id       = $user->id;
                $newUser->avatar          = $user->avatar;
                $newUser->avatar_original = $user->avatar_original;
                $newUser->lastlogin_at    = \Carbon\Carbon::now();
                $newUser->save();
                auth()->login($newUser, true);
            }
            session(['user_name' => $user->name]);
            session(['user_email' => $user->email]);
            session(['user_avatar' => $user->avatar]);
    
            return redirect()->to('/home');
        }
    }
    
    Route::get('/redirect', 'Auth\LoginController@redirectToProvider');
    Route::get('/callback', 'Auth\LoginController@handleProviderCallback');
    

    【讨论】:

    • 是的,我试过了,工作正常,但是当我在中间件中执行此操作时发生错误:(
    【解决方案2】:

    并包括这些:

    use Illuminate\Foundation\Auth\AuthenticatesUsers; use Socialite;

    【讨论】:

      【解决方案3】:

      你可以试试这个吗?

      if($finduser) {
          auth()->login($finduser), true);
      }
      else {
          return redirect('/logingoogle');
      }
      

      【讨论】:

      • 错误消失了,但是这个语句循环运行,我该如何解决这个 return Socialite::driver('google')->redirect();
      • 我只是在我的现有中间件中使用这一行,在句柄函数 return Socialite::driver('google')->stateless()->redirect();
      • 去掉无状态函数会怎样?如果您不为每个文件粘贴完整代码,没有人可以帮助您。
      • 现在,你也可以看到我的控制器了
      • 当我删除无状态函数时,同样的问题发生
      猜你喜欢
      • 2014-01-26
      • 2022-10-17
      • 2020-03-25
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多