Laravel Socialite自定义SSO驱动报错:AbstractProvider参数类型不匹配
环境
- Laravel v8.65
- Socialite v5.9
错误信息
Laravel\Socialite\Two\AbstractProvider::__construct(): Argument #1 ($request) must be of type Illuminate\Http\Request, Illuminate\Foundation\Application given, called in /Users/m/Documents/websites/a/vendor/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php on line 208
相关代码
NoviServiceProvider.php
<?php namespace App\Providers; use Laravel\Socialite\Two\User; use GuzzleHttp\Exception\GuzzleException; use Laravel\Socialite\Two\AbstractProvider; use Laravel\Socialite\Two\ProviderInterface; use Illuminate\Http\Request; class NoviServiceProvider extends AbstractProvider { /** * @var string[] */ protected $scopes = [ 'openid', 'profile', ]; /** * @var string */ protected $scopeSeparator = ' '; public function getNoviUrl() { return config('services.novi.base_uri') . '/oauth'; } /** * @param string $state * * @return string */ protected function getAuthUrl($state) { return $this->buildAuthUrlFromBase($this->getNoviUrl() . '/authorize', $state); } /** * @return string */ protected function getTokenUrl() { return $this->getCognitoUrl() . '/token'; } /** * @param string $token * * @throws GuzzleException * * @return array|mixed */ protected function getUserByToken($token) { $response = $this->getHttpClient()->post($this->getNoviUrl() . '/userInfo', [ 'headers' => [ 'cache-control' => 'no-cache', 'Authorization' => 'Bearer ' . $token, 'Content-Type' => 'application/x-www-form-urlencoded', ], ]); return json_decode($response->getBody()->getContents(), true); } /** * @return User */ protected function mapUserToObject(array $user) { return (new User())->setRaw($user)->map([ 'id' => $user['sub'], 'email' => $user['email'], 'username' => $user['username'], 'email_verified' => $user['email_verified'], 'family_name' => $user['family_name'], ]); } }
AppServiceProvider.php
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Laravel\Socialite\Contracts\Factory; class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { $socialite = $this->app->make(Factory::class); $socialite->extend('novi', function () use ($socialite) { $config = config('services.novi'); return $socialite->buildProvider(NoviServiceProvider::class, $config); }); } }
解决方案
核心原因
你把自定义Socialite驱动类命名为NoviServiceProvider,Laravel会自动识别所有带ServiceProvider后缀的类作为应用服务提供者尝试加载,框架会传入Application实例去构造它,但该类继承的AbstractProvider需要的是Request实例,从而触发类型错误。
修复步骤
- 重命名自定义驱动类
将NoviServiceProvider改为非ServiceProvider结尾的名称,比如NoviProvider,示例代码:
<?php namespace App\Providers; use Laravel\Socialite\Two\User; use GuzzleHttp\Exception\GuzzleException; use Laravel\Socialite\Two\AbstractProvider; use Laravel\Socialite\Two\ProviderInterface; use Illuminate\Http\Request; class NoviProvider extends AbstractProvider { // 保留原有的所有属性和方法代码 }
- 更新AppServiceProvider中的扩展代码
修改boot方法中的类引用,指向新的NoviProvider:
public function boot() { $socialite = $this->app->make(Factory::class); $socialite->extend('novi', function () use ($socialite) { $config = config('services.novi'); return $socialite->buildProvider(NoviProvider::class, $config); }); }
- 修复代码笔误
getTokenUrl方法中错误调用了不存在的getCognitoUrl()方法,修正为:
protected function getTokenUrl() { return $this->getNoviUrl() . '/token'; }
- 清理缓存
运行以下命令清除配置和类加载缓存,确保修改生效:
php artisan config:clear php artisan cache:clear composer dump-autoload
内容的提问来源于stack exchange,提问作者markusp
相关产品推荐
相关产品推荐

