我在生产环境中使用 Laravel Socialite 的 Google 身份验证时遇到问题。错误与这篇文章相同:
laravel 社交名流无法在实时服务器上运行,只能在本地计算机上运行
但是我有一个 Apache 服务器,经过多次尝试,我还没有找到解决方案。
编辑:
客户端错误:POST“https://www.googleapis.com/oauth2/v4/token”导致“400 错误请求” 回复:
{
"error": "invalid_request",
"error_description": "Missing required parameter: code"
}
public function redirectToProvider($driver)
{
// return Socialite::driver($driver)->stateless()->redirect();
return Socialite::driver('google') ->setScopes(['openid', 'email'])
->redirect();
}
如果您正在运行 Nginx 服务器,请参阅此答案。
运行
sudo nano /etc/nginx/sites-available/default
或您的站点配置文件
并修复了这一行:
try_files $uri $uri/ /index.php?query_string; // wrong
到
try_files $uri $uri/ /index.php?$query_string; // fixed
首先检查您的重定向网址是否正确并运行命令:
php artisan 护照:安装
看下面的代码片段可能对你有帮助
public function socialRedirect($provider)
{
if ($provider === 'clever') {
$clientId = Config::get('services.clever.client_id');
$redirect = Config::get('services.clever.redirect');
return redirect()->away('https://clever.com/oauth/authorize?response_type=code&redirect_uri=' . $redirect . '&client_id=' . $clientId);
} else {
return Socialite::driver($provider)->redirect();
}
}
public function socialCallback($provider)
{
if ($provider === 'apple') {
$token = app(Configuration::class)->parser()->parse(app(AppleToken::class)->generate());
config()->set('services.apple.client_secret', $token);
}
$socialUser = Socialite::driver($provider)->setHttpClient(new Client(['verify' => false]))->user();
$userIdentity = UserIdentity::where('provider_id', $socialUser->id)->where('provider_name', $provider)->first();
$userRole = UserRole::where('slug', 'user')->first();
if ($userIdentity) {
// retrieve the user from users store
$user = User::where('id', $userIdentity->user_id)->with('userRole')->with('account')->first();
// assign access token to user
$token = $user->createToken('social');
$accessToken = $token->accessToken;
$arguments = [
'success' => true,
'accessToken' => $accessToken,
'expiresAt' => Carbon::parse($token->token->expires_at)->toDateTimeString(),
'user' => json_encode($user)
];
return redirect()->away(env('CLIENT_URL') . '/social/callback?' . http_build_query($arguments));
} else {
$user = User::where('email', $socialUser->email)->with('userRole')->with('account')->first();
if (!($user && isset($user->id))) {
/* $newUser = User::create([
'fname' => $socialUser->name ?? '',
'lname' => '',
'email' => $socialUser->email,
'image' => $socialUser->avatar ?? '',
'user_role_id' => $userRole->id,
'account_id' => 1,
'password' => Hash::make(Str::random(40)),
'status' => 'active',
]);
$user = User::where('email', $socialUser->email)->with('userRole')->with('account')->first(); */
$arguments = [
'success' => false,
];
return redirect()->away(env('CLIENT_URL') . '/social/callback?' . http_build_query($arguments));
} else {
// store user social provider info
if ($user) {
UserIdentity::create([
'provider_name' => $provider,
'provider_id' => $socialUser->id,
'user_id' => $user->id,
]);
}
// assign passport token to user
$token = $user->createToken('social');
$accessToken = $token->accessToken;
$arguments = [
'success' => true,
'accessToken' => $accessToken,
'expiresAt' => Carbon::parse($token->token->expires_at)->toDateTimeString(),
'user' => json_encode($user)
];
return redirect()->away(env('CLIENT_URL') . '/social/callback?' . http_build_query($arguments));
}
}
我也有同样的问题 在我知道问题之前,我的代码是这样的。
$user = Socialite::driver($provider)->stateless()->user();
$existingUser = User::where('email', $user->email)->first();
在我的历史记录中,在无状态()之后的方法 user() 中发生了错误 当用户单击按钮取消登录以进行处理时会发生问题 在页面上用谷歌登录。据我们所知,在您选择后,您的电子邮件将重定向您以选择带有选项的新页面 取消 |继续
所以我们像这样应用 try catch
try {
$user = Socialite::driver($provider)->stateless()->user();
} catch (\Exception $e) {
return redirect()->to('https://blablabla.id/login');
}
就解决了。所以,谢谢先生。我希望我对这个问题的描述能够帮助别人。
此问题是由于 vendor\laravel\socialite\src\Two\GoogleProvider.php 中的 profile 范围而发生的。
您可以通过以下两种方式克服此错误:
protected $scopes = [
'openid',
'email',
];
return Socialite::driver('google')->stateless()->redirect();