Laravel 8集成OAuth 1.0报bindShared()未定义错误如何解决?
报错根因
jenssegers/laravel-oauth包最后一次更新为2015年,仅适配Laravel 4.x~5.1版本。包内服务提供者调用的bindShared()方法在Laravel 5.2版本已被废弃移除,官方替换为singleton()方法实现相同的单例绑定逻辑,Laravel 8中不存在这个旧方法,必然触发报错。该包已停止维护多年,无适配新版本Laravel的计划,直接弃用即可。
Laravel 8 集成 OAuth 1.0 完整操作流程
1. 清理旧依赖、安装适配包
如果已经安装了旧的jenssegers/oauth包,先执行命令移除:
composer remove jenssegers/laravel-oauth
安装Laravel官方生态维护、兼容Laravel8的OAuth客户端套件:
composer require laravel/socialite socialiteproviders/manager socialiteproviders/oauth1
2. 注册服务与别名
打开config/app.php,在对应数组中添加配置(开启包自动发现的环境可跳过这步):
'providers' => [ // 保留文件内原有其他服务提供者配置 Laravel\Socialite\SocialiteServiceProvider::class, SocialiteProviders\Manager\ServiceProvider::class, ], 'aliases' => [ // 保留文件内原有其他别名配置 'Socialite' => Laravel\Socialite\Facades\Socialite::class, ]
3. 注册事件监听
打开app/Providers/EventServiceProvider.php,在$listen数组中添加Socialite必需的事件订阅:
protected $listen = [ // 保留文件内原有其他事件监听配置 \SocialiteProviders\Manager\SocialiteWasCalled::class => [ 'SocialiteProviders\\OAuth1\\OAuth1ExtendSocialite@handle', ], ];
4. 配置OAuth1凭证
执行配置发布命令生成Socialite配置文件:
php artisan vendor:publish --provider="Laravel\Socialite\SocialiteServiceProvider"
打开config/services.php,添加OAuth1对接配置:
'oauth1' => [ 'client_id' => env('OAUTH1_CLIENT_ID'), 'client_secret' => env('OAUTH1_CLIENT_SECRET'), 'redirect' => env('OAUTH1_REDIRECT_URI'), 'request_token_url' => '对接平台提供的request_token接口地址', 'authorize_url' => '对接平台提供的用户授权页地址', 'access_token_url' => '对接平台提供的access_token接口地址', ],
打开项目根目录的.env文件,填写对应申请到的凭证参数:
OAUTH1_CLIENT_ID=你的平台客户端ID OAUTH1_CLIENT_SECRET=你的平台客户端密钥 OAUTH1_REDIRECT_URI=你的授权回调地址
5. 编写授权路由与逻辑
打开routes/web.php,添加授权跳转、回调处理两个路由:
use Laravel\Socialite\Facades\Socialite; // 发起OAuth1授权跳转 Route::get('/auth/oauth1/redirect', function () { return Socialite::driver('oauth1')->redirect(); }); // 授权回调处理 Route::get('/auth/oauth1/callback', function () { $oauthUser = Socialite::driver('oauth1')->user(); // 可获取的核心凭证 // $oauthUser->id 平台方用户唯一ID // $oauthUser->token 访问令牌access_token // $oauthUser->tokenSecret OAuth1必需的令牌密钥,后续请求接口必须携带 // 自行编写用户登录、账号绑定、凭证存储等业务逻辑即可 dd($oauthUser); });
注意事项
- OAuth1接口请求对签名规则要求严格,存储用户授权凭证时必须同时保存
token和tokenSecret,缺失任意一个都会导致后续接口请求签名校验失败。 - 如果对接的是Twitter、Tumblr等已有专属Socialite驱动的公开平台,可直接使用对应平台的专属驱动包,无需使用通用OAuth1驱动,配置更简便。
内容的提问来源于stack exchange,提问作者Chitrasen
相关产品推荐
相关产品推荐

