php - 如何在 Laravel Socialite 中使用 Oauth2 Provider 代替 Oauth1?

标签 php laravel laravel-socialite

我目前正在使用 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/

相关文章:

php - ReflectionException 类 LoginController 不存在

php - 如何使用 Laravel Socialite 正确修复 CURL 错误 60?

java - 从 PHP 调用 Web 服务

javascript - 使用 jQuery AJAX 更新 mysql 表

php - 数据库设计 | PHP-Mysql | JSON

php - 从多对多关系的反面保存问题

php - laravel:找不到支持的加密器。密码和/或 key 长度无效

laravel - 如何仅使用 Y-m-d 部分按 created_at 日期从集合中获取项目?

php - 如何读取保存在客户端浏览器cookie内存中的laravel_session cookies?

laravel - 如何处理laravel社交名流 "Missing authorization Exception"