我在Ladvel 5.2中使用Reddit的社交网络提供商。为了在身份验证期间解决Reddit错误(“请求太多”),我无法覆盖Socialite Provider方法以向身份验证请求添加自定义标头(“User-Agent”)。
以下是详细信息。
最初的问题是我在使用Reddit进行身份验证时遇到错误:
$response = $this->getHttpClient()->post($this->getTokenUrl(), [
'headers' => ['Accept' => 'application/json',
'User-Agent' => 'mydomain.com: v1.0 (by /u/reddituser)'],
'auth' => [$this->clientId, $this->clientSecret],
'form_params' => $this->getTokenFields($code),
]);
我可以通过修改名为 getAccessToken 的 vendor / socialiteproviders \ reddit \ src \ Provider.php 方法修复错误,以包含名为“User-Agent”的标头。
namespace app\Library\redditOverride;
use SocialiteProviders\Reddit\Provider;
class CustomRedditProvider extends Provider {
// public function getAccessToken($code)
public function getAccessToken($code)
{
dd('RedditCustomProvider getAccessToken');
$response = $this->getHttpClient()->post($this->getTokenUrl(), [
'headers' => ['Accept' => 'application/json',
'User-Agent' => 'mydomain.com: v1.0 (by /u/reddituser)'],
'auth' => [$this->clientId, $this->clientSecret],
'form_params' => $this->getTokenFields($code),
]);
$this->credentialsResponseBody = json_decode($response->getBody(), true);
return $this->parseAccessToken($response->getBody());
}
}
此解决方案的问题在于,通过更新供应商文件很容易丢失我的修改。相反,我想扩展Providers类并覆盖getAccessToken方法。
我能够让ServiceProvider注册我的自定义方法,但我似乎无法让自定义方法实际运行代替原始方法。
这是我的代码
app \ Library \ CustomRedditProvider.php(注意永远不会执行的dd)
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class RedditOverrideServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->app['customredditprovider'] = $this->app->share(function($app)
{
return new CustomRedditProvider();
});
}
}
应用程序/提供者/ RedditOverrrideServiceProvider.php
\SocialiteProviders\Manager\ServiceProvider::class,
App\Providers\RedditOverrideServiceProvider::class,
配置/ app.php
"autoload": {
"classmap": [
"database",
"app/library"
],
composer.json
{{1}}