SocialiteWasCalled.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <?php
  2. namespace SocialiteProviders\Manager;
  3. use Illuminate\Contracts\Container\Container as Application;
  4. use Laravel\Socialite\Contracts\Factory as SocialiteFactory;
  5. use Laravel\Socialite\One\AbstractProvider as SocialiteOAuth1AbstractProvider;
  6. use Laravel\Socialite\SocialiteManager;
  7. use Laravel\Socialite\Two\AbstractProvider as SocialiteOAuth2AbstractProvider;
  8. use League\OAuth1\Client\Server\Server as OAuth1Server;
  9. use SocialiteProviders\Manager\Contracts\Helpers\ConfigRetrieverInterface;
  10. use SocialiteProviders\Manager\Exception\InvalidArgumentException;
  11. class SocialiteWasCalled
  12. {
  13. public const SERVICE_CONTAINER_PREFIX = 'SocialiteProviders.config.';
  14. /**
  15. * @var \Illuminate\Contracts\Container\Container
  16. */
  17. protected $app;
  18. /**
  19. * @var \SocialiteProviders\Manager\Contracts\Helpers\ConfigRetrieverInterface
  20. */
  21. private $configRetriever;
  22. /**
  23. * @param \Illuminate\Contracts\Container\Container $app
  24. * @param \SocialiteProviders\Manager\Contracts\Helpers\ConfigRetrieverInterface $configRetriever
  25. */
  26. public function __construct(Application $app, ConfigRetrieverInterface $configRetriever)
  27. {
  28. $this->app = $app;
  29. $this->configRetriever = $configRetriever;
  30. }
  31. /**
  32. * @param string $providerName 'meetup'
  33. * @param string $providerClass 'Your\Name\Space\ClassNameProvider' must extend
  34. * either Laravel\Socialite\Two\AbstractProvider or
  35. * Laravel\Socialite\One\AbstractProvider
  36. * @param string $oauth1Server 'Your\Name\Space\ClassNameServer' must extend League\OAuth1\Client\Server\Server
  37. * @return void
  38. */
  39. public function extendSocialite($providerName, $providerClass, $oauth1Server = null)
  40. {
  41. /** @var SocialiteManager $socialite */
  42. $socialite = $this->app->make(SocialiteFactory::class);
  43. $this->classExists($providerClass);
  44. if ($this->isOAuth1($oauth1Server)) {
  45. $this->classExists($oauth1Server);
  46. $this->classExtends($providerClass, SocialiteOAuth1AbstractProvider::class);
  47. }
  48. $socialite->extend(
  49. $providerName,
  50. function () use ($socialite, $providerName, $providerClass, $oauth1Server) {
  51. $provider = $this->buildProvider($socialite, $providerName, $providerClass, $oauth1Server);
  52. if (defined('SOCIALITEPROVIDERS_STATELESS') && SOCIALITEPROVIDERS_STATELESS) {
  53. return $provider->stateless();
  54. }
  55. return $provider;
  56. }
  57. );
  58. }
  59. /**
  60. * @param \Laravel\Socialite\SocialiteManager $socialite
  61. * @param string $providerName
  62. * @param string $providerClass
  63. * @param null|string $oauth1Server
  64. * @return \Laravel\Socialite\One\AbstractProvider|\Laravel\Socialite\Two\AbstractProvider
  65. */
  66. protected function buildProvider(SocialiteManager $socialite, $providerName, $providerClass, $oauth1Server)
  67. {
  68. if ($this->isOAuth1($oauth1Server)) {
  69. return $this->buildOAuth1Provider($socialite, $providerClass, $providerName, $oauth1Server);
  70. }
  71. return $this->buildOAuth2Provider($socialite, $providerClass, $providerName);
  72. }
  73. /**
  74. * Build an OAuth 1 provider instance.
  75. *
  76. * @param \Laravel\Socialite\SocialiteManager $socialite
  77. * @param string $providerClass must extend Laravel\Socialite\One\AbstractProvider
  78. * @param string $providerName
  79. * @param string $oauth1Server must extend League\OAuth1\Client\Server\Server
  80. * @return \Laravel\Socialite\One\AbstractProvider
  81. */
  82. protected function buildOAuth1Provider(SocialiteManager $socialite, $providerClass, $providerName, $oauth1Server)
  83. {
  84. $this->classExtends($oauth1Server, OAuth1Server::class);
  85. $config = $this->getConfig($providerClass, $providerName);
  86. $configServer = $socialite->formatConfig($config->get());
  87. $provider = new $providerClass(
  88. $this->app->offsetGet('request'), new $oauth1Server($configServer)
  89. );
  90. $provider->setConfig($config);
  91. return $provider;
  92. }
  93. /**
  94. * Build an OAuth 2 provider instance.
  95. *
  96. * @param SocialiteManager $socialite
  97. * @param string $providerClass must extend Laravel\Socialite\Two\AbstractProvider
  98. * @param string $providerName
  99. * @return \Laravel\Socialite\Two\AbstractProvider
  100. */
  101. protected function buildOAuth2Provider(SocialiteManager $socialite, $providerClass, $providerName)
  102. {
  103. $this->classExtends($providerClass, SocialiteOAuth2AbstractProvider::class);
  104. $config = $this->getConfig($providerClass, $providerName);
  105. $provider = $socialite->buildProvider($providerClass, $config->get());
  106. $provider->setConfig($config);
  107. return $provider;
  108. }
  109. /**
  110. * @param string $providerClass
  111. * @param string $providerName
  112. * @return \SocialiteProviders\Manager\Contracts\ConfigInterface
  113. */
  114. protected function getConfig(string $providerClass, string $providerName)
  115. {
  116. return $this->configRetriever->fromServices(
  117. $providerName, $providerClass::additionalConfigKeys()
  118. );
  119. }
  120. /**
  121. * Check if a server is given, which indicates that OAuth1 is used.
  122. *
  123. * @param string $oauth1Server
  124. * @return bool
  125. */
  126. private function isOAuth1($oauth1Server)
  127. {
  128. return ! empty($oauth1Server);
  129. }
  130. /**
  131. * @param string $class
  132. * @param string $baseClass
  133. * @return void
  134. *
  135. * @throws \SocialiteProviders\Manager\Exception\InvalidArgumentException
  136. */
  137. private function classExtends($class, $baseClass)
  138. {
  139. if (false === is_subclass_of($class, $baseClass)) {
  140. throw new InvalidArgumentException("{$class} does not extend {$baseClass}");
  141. }
  142. }
  143. /**
  144. * @param string $providerClass
  145. * @return void
  146. *
  147. * @throws \SocialiteProviders\Manager\Exception\InvalidArgumentException
  148. */
  149. private function classExists($providerClass)
  150. {
  151. if (! class_exists($providerClass)) {
  152. throw new InvalidArgumentException("{$providerClass} doesn't exist");
  153. }
  154. }
  155. }