Laravel 社交名流 - Google 身份验证在本地工作,但不在生产中工作:缺少必需的参数代码

问题描述 投票:0回答:5

我在生产环境中使用 Laravel Socialite 的 Google 身份验证时遇到问题。错误与这篇文章相同:

laravel 社交名流无法在实时服务器上运行,只能在本地计算机上运行

但是我有一个 Apache 服务器,经过多次尝试,我还没有找到解决方案。

编辑:

客户端错误:POST“https://www.googleapis.com/oauth2/v4/token”导致“400 错误请求” 回复:

{
 "error": "invalid_request",
 "error_description": "Missing required parameter: code"
}
laravel google-authentication laravel-socialite
5个回答
1
投票
    public function redirectToProvider($driver)
{
  //  return Socialite::driver($driver)->stateless()->redirect();
    return Socialite::driver('google') ->setScopes(['openid', 'email'])

        ->redirect();
}

0
投票

如果您正在运行 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 


0
投票

首先检查您的重定向网址是否正确并运行命令:

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));
      }
    }


0
投票

我也有同样的问题 在我知道问题之前,我的代码是这样的。

$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');
}

就解决了。所以,谢谢先生。我希望我对这个问题的描述能够帮助别人。


-2
投票

此问题是由于 vendor\laravel\socialite\src\Two\GoogleProvider.php 中的 profile 范围而发生的。

您可以通过以下两种方式克服此错误:

  1. 删除或评论 profile 范围 vendor\laravel\socialite\src\Two\GoogleProvider.php
    protected $scopes = [
        'openid',
        'email',
    ];
  1. 启动Google OAUth2 stateless();
    return Socialite::driver('google')->stateless()->redirect();
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.