【问题标题】:How to use Oauth2 Provider instead of Oauth1 in Laravel Socialite?如何在 Laravel Socialite 中使用 Oauth2 Provider 而不是 Oauth1?
【发布时间】:2022-01-27 15:09:46
【问题描述】:

我目前正在使用 twitter 开发社交监听 API,登录用户的流程(使用基本 API 令牌向 API 发送请求)被重定向到 twitter 应用程序并通过 Laravel Socialite 提供的重定向链接登录到 twitter 帐户.成功登录后,账号信息将与注册账号的用户一起保存在 MySQL 中。

我正在使用 Laravel 7 和 Socialite v5.4.0

我一直在尝试使用以下方法在回调 url 中提供查询参数:

Socialite::driver('twitter')
        ->redirectUrl('https://some-site-url.com/twitter/login/callback?api_token={sample-token}')
        ->redirect()->getTargetUrl());

但社交名流返回错误Call to undefined method 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 而不是基本上在 Socialite 本身中可用的 Oauth1 ?我试图重写该方法,但没有找到指向哪个实例正在调用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
    );
}

.该方法有效,它成功返回了重定向 url,但由于未知原因未能登录到 Twitter 页面,这让我想到有没有办法在 Oauth1 和 Oauth2 之间干净地切换社交名流提供者版本。或者是否有任何替代方法可以提供带有用户标识符的回调?

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 之间切换社交名流提供商的具体方法

【问题讨论】:

    标签: php laravel laravel-socialite


    【解决方案1】:

    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 密钥添加到 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 和客户端密码,您可以从您的 Twitter developer account 获得。

    【讨论】:

      猜你喜欢
      • 2018-01-15
      • 1970-01-01
      • 2014-01-19
      • 2016-07-11
      • 1970-01-01
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多