laravel - Socialite 不能在 Laravel 中间件中工作,我该如何解决这个问题?
问题描述
我正在使用 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');
}
}
解决方案
你能试试这个吗?
if($finduser) {
auth()->login($finduser), true);
}
else {
return redirect('/logingoogle');
}
推荐阅读
- sql-server - SQL Server LIKE 包含括号字符(变量)
- jquery - jQuery:grep() 一个数组并从中获取匹配的值
- ruby-on-rails - 如何在初始化程序中设置回调?
- node.js - AWS lambda javascript IAM 角色
- ag-grid - ag-Grid:toolPanel 仅在 ag-Grid Enterprise 中可用
- c - 在结构中创建指向数组的指针
- android - 在 RecyclerView 中回收视图后,EditText(或 android.support.v7.widget.AppCompatEditText)的长按损坏
- tensorflow - tensorflow 估计器自定义指标:使用 sklearn 指标?
- windows - windows linux子系统explorer.exe
- python-3.x - 我可以在多行字符串中使用方法吗?[无效的语法]