Files
Virtnet.bond/vendor/socialiteproviders/manager/src/OAuth1/AbstractProvider.php
2026-03-12 22:47:38 +01:00

193 lines
5.1 KiB
PHP

<?php
namespace SocialiteProviders\Manager\OAuth1;
use Illuminate\Http\RedirectResponse;
use InvalidArgumentException;
use Laravel\Socialite\One\AbstractProvider as BaseProvider;
use League\OAuth1\Client\Credentials\CredentialsException;
use League\OAuth1\Client\Credentials\TemporaryCredentials;
use League\OAuth1\Client\Credentials\TokenCredentials;
use SocialiteProviders\Manager\ConfigTrait;
use SocialiteProviders\Manager\Contracts\ConfigInterface as Config;
use SocialiteProviders\Manager\Contracts\OAuth1\ProviderInterface;
use SocialiteProviders\Manager\SocialiteWasCalled;
abstract class AbstractProvider extends BaseProvider implements ProviderInterface
{
use ConfigTrait;
/**
* Indicates if the session state should be utilized.
*
* @var bool
*/
protected $stateless = true;
/**
* @var array
*/
protected $credentialsResponseBody;
/**
* @param string $providerName
* @return string
*/
public static function serviceContainerKey($providerName)
{
return SocialiteWasCalled::SERVICE_CONTAINER_PREFIX.$providerName;
}
/**
* {@inheritdoc}
*/
public function user()
{
if (! $this->hasNecessaryVerifier()) {
throw new InvalidArgumentException('Invalid request. Missing OAuth verifier.');
}
$token = $this->getToken();
$tokenCredentials = $token['tokenCredentials'];
$user = $this->mapUserToObject((array) $this->server->getUserDetails($tokenCredentials));
$user->setToken($tokenCredentials->getIdentifier(), $tokenCredentials->getSecret());
if ($user instanceof User) {
parse_str((string) $token['credentialsResponseBody'], $credentialsResponseBody);
if (! $credentialsResponseBody || ! is_array($credentialsResponseBody)) {
throw new CredentialsException('Unable to parse token credentials response.');
}
$user->setAccessTokenResponseBody($credentialsResponseBody);
}
return $user;
}
/**
* {@inheritdoc}
*/
public function userFromTokenAndSecret($token, $secret)
{
$tokenCredentials = new TokenCredentials;
$tokenCredentials->setIdentifier($token);
$tokenCredentials->setSecret($secret);
$user = $this->mapUserToObject((array) $this->server->getUserDetails($tokenCredentials));
$user->setToken($tokenCredentials->getIdentifier(), $tokenCredentials->getSecret());
return $user;
}
/**
* Redirect the user to the authentication page for the provider.
*
* @return \Illuminate\Http\RedirectResponse
*/
public function redirect()
{
if (! $this->isStateless()) {
$this->request->getSession()->put(
'oauth.temp', $temp = $this->server->getTemporaryCredentials()
);
} else {
$temp = $this->server->getTemporaryCredentials();
$this->request->session()->put('oauth_temp', serialize($temp));
}
return new RedirectResponse($this->server->getAuthorizationUrl($temp));
}
/**
* Indicates that the provider should operate as stateless.
*
* @param mixed $stateless
* @return $this
*/
public function stateless($stateless = true)
{
$this->stateless = $stateless;
return $this;
}
/**
* Set the scopes of the requested access.
*
* @param array $scopes
* @return $this
*/
public function scopes(array $scopes)
{
$this->server = $this->server->scopes($scopes);
return $this;
}
/**
* Set the custom parameters of the request.
*
* @param array $parameters
* @return $this
*/
public function with(array $parameters)
{
$this->server = $this->server->with($parameters);
return $this;
}
/**
* @param Config $config
* @return $this
*/
public function setConfig(Config $config)
{
$this->config = $this->server->setConfig($config);
return $this;
}
/**
* Get the token credentials for the request.
*
* @return \League\OAuth1\Client\Credentials\TokenCredentials
*/
protected function getToken()
{
if (! $this->isStateless()) {
$temp = $this->request->getSession()->get('oauth.temp');
return $this->server->getTokenCredentials(
$temp, $this->request->get('oauth_token'), $this->request->get('oauth_verifier')
);
}
$temp = unserialize($this->request->session()->get('oauth_temp'), [
'allowed_classes' => [TemporaryCredentials::class],
]);
return $this->server->getTokenCredentials(
$temp, $this->request->get('oauth_token'), $this->request->get('oauth_verifier')
);
}
/**
* Determine if the provider is operating as stateless.
*
* @return bool
*/
protected function isStateless()
{
if (defined('SOCIALITEPROVIDERS_STATELESS')) {
return true;
}
return $this->stateless;
}
}