You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Socialite自定义SSO驱动报错:AbstractProvider参数类型不匹配

问题:Laravel Socialite自定义驱动构造函数参数类型错误

环境

  • 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实例,从而触发类型错误。

修复步骤

  1. 重命名自定义驱动类
    将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
{
    // 保留原有的所有属性和方法代码
}
  1. 更新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);
    });
}
  1. 修复代码笔误
    getTokenUrl方法中错误调用了不存在的getCognitoUrl()方法,修正为:
protected function getTokenUrl()
{
    return $this->getNoviUrl() . '/token';
}
  1. 清理缓存
    运行以下命令清除配置和类加载缓存,确保修改生效:
php artisan config:clear
php artisan cache:clear
composer dump-autoload

内容的提问来源于stack exchange,提问作者markusp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:17:16