我目前正在使用 Twitter 开发社交监听 API,流程已登录用户(使用基本 API token 向 API 发送请求)被重定向到 Twitter 应用程序,并通过 Laravel Socialite 提供的重定向链接登录到 Twitter 帐户。成功登录后,帐户信息将与注册帐户的用户一起保存在MySQL中。
我正在使用 Laravel 7 和 Socialite v5.4.0
我一直在尝试使用以下方法在回调网址中提供查询参数:
Socialite::driver('twitter')
->redirectUrl('https://some-site-url.com/twitter/login/callback?api_token={sample-token}')
->redirect()->getTargetUrl());
但是 Socialite 返回错误调用未定义的方法 Laravel\\Socialite\\One\\TwitterProvider::redirectUrl()",
那时我意识到当前使用的 twitter 提供程序正在使用 Oauth1 Laravel\Socialite\One\TwitterProvider。当我在 Laravel\Socialite\\SocialiteManager.php
中查看供应商时,它创建了以下实例:
/**
* Create an instance of the specified driver.
*
* @return \Laravel\Socialite\One\AbstractProvider
*/
protected function createTwitterDriver()
{
$config = $this->config->get('services.twitter');
return new TwitterProvider(
$this->container->make('request'), new TwitterServer($this->formatConfig($config))
);
}
但在同一个 Laravel\Socialite\\SocialiteManager.php
中,它也有创建 Oauth2 实例的方法,如下所示:
/**
* Create an instance of the specified driver.
*
* @return \Laravel\Socialite\Two\AbstractProvider
*/
protected function createTwitterOAuth2Driver()
{
$config = $this->config->get('services.twitter');
return $this->buildProvider(
TwitterOAuth2Provider::class, $config
);
}
问题
现在我的问题是如何强制 Socialite::driver('twitter') 方法使用 Oauth2 而不是 Oauth1,后者基本上在 Socialite 本身中可用?我试图覆盖该方法,但没有找到哪个实例正在调用 SocialiteManager.php
的链接,因此目前我只尝试修改供应商函数以返回 Oauth2 AbstractProvider (我知道它的方法非常丑陋)但我真的很好奇),就像这样:
// /**
// * Create an instance of the specified driver.
// *
// * @return \Laravel\Socialite\One\AbstractProvider
// */
// protected function createTwitterDriver()
// {
// $config = $this->config->get('services.twitter');
// return new TwitterProvider(
// $this->container->make('request'), new TwitterServer($this->formatConfig($config))
// );
// }
/**
* Create an instance of the specified driver.
*
* @return \Laravel\Socialite\Two\AbstractProvider
*/
protected function createTwitterDriver()
{
$config = $this->config->get('services.twitter');
return $this->buildProvider(
TwitterOAuth2Provider::class, $config
);
}
.该方法有效并且成功返回重定向网址,但由于未知原因无法登录 Twitter 页面,这让我想到是否有一种方法可以在 Oauth1 和 Oauth2 之间干净地切换 Socialite 提供程序版本。或者是否有其他方法可以提供带有用户标识符的回调?
the url return after i ditch the method in vendor SocialiteManager.php But failed to log in to twitter app for unknown reason
提前致谢,这是我的第一个问题,从昨天起我一直在寻找答案,但没有找到在版本 1 和版本 2 之间切换 Socialite 提供程序的具体方法
最佳答案
Laravel\Socialite\SocialiteManager.php 在您的 twitter 凭证中查找 oauth 键以确定是使用 OAuth1 还是 Oauth2
/**
* Create an instance of the specified driver.
*
* @return \Laravel\Socialite\One\AbstractProvider
*/
protected function createTwitterDriver()
{
$config = $this->config->get('services.twitter');
if (($config['oauth'] ?? null) === 2) {
return $this->createTwitterOAuth2Driver();
}
return new TwitterProvider(
$this->container->make('request'), new TwitterServer($this->formatConfig($config))
);
}
只需将值为 2 的 oauth key 添加到 config/services.php 文件中的 Twitter 凭据即可。
'twitter' => [
'client_id' => env('TWITTER_CLIENT_ID'),
'client_secret' => env('TWITTER_CLIENT_SECRET'),
'redirect' => env('TWITTER_REDIRECT_URL'),
'oauth' => 2
],
如果您要从 oauth1 切换,请不要忘记更新您的凭据以使用 OAuth 2.0 客户端 ID 和客户端 key ,您可以从 Twitter developer account 获取这些信息。 .
关于php - 如何在 Laravel Socialite 中使用 Oauth2 Provider 代替 Oauth1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70880931/