Source of file OAuthConfiguration.php

Size: 3,651 Bytes - Last Modified: 2019-08-09T18:27:54+00:00

/home/travis/build/zerospam/sdk-framework/src/Config/OAuthConfiguration.php

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
<?php
/**
 * Created by PhpStorm.
 * User: aaflalo
 * Date: 18-06-01
 * Time: 09:43.
 */

namespace ZEROSPAM\Framework\SDK\Config;

use League\OAuth2\Client\Grant\AuthorizationCode;
use League\OAuth2\Client\Grant\RefreshToken;
use League\OAuth2\Client\Provider\AbstractProvider;
use League\OAuth2\Client\Token\AccessToken;
use ZEROSPAM\Framework\SDK\Client\Middleware\IMiddleware;
use ZEROSPAM\Framework\SDK\Client\Middleware\IPreRequestMiddleware;

/**
 * Class OAuthConfiguration
 *
 * Helper for an OAuthConfiguration.
 *
 * You need to implement the providerClass by pointing it to your wanted OAuthProvider
 *
 * @see     AbstractProvider
 * @package ZEROSPAM\Framework\SDK\Config
 */
abstract class OAuthConfiguration implements IOAuthConfiguration
{
    /**
     * @var string
     */
    private $clientId;

    /**
     * @var string
     */
    private $clientSecret;

    /**
     * @var string
     */
    private $redirectUrl;
    /**
     * @var string
     */
    private $endPoint;

    /**
     * OAuthConfiguration constructor.
     *
     * @param string $clientId
     * @param string $clientSecret
     * @param string $redirectUrl
     * @param string $endPoint
     */
    public function __construct(string $clientId, string $clientSecret, string $redirectUrl, string $endPoint)
    {
        $this->clientId     = $clientId;
        $this->clientSecret = $clientSecret;
        $this->redirectUrl  = $redirectUrl;
        $this->endPoint     = $endPoint;
    }

    /**
     * Class to use for the provider.
     *
     * @return string
     */
    abstract protected function providerClass(): string;

    /**
     * @return IMiddleware[]
     */
    public function defaultMiddlewares(): array
    {
        return [];
    }

    /**
     * @return IPreRequestMiddleware[]
     */
    public function defaultPreRequestMiddlewares(): array
    {
        return [];
    }

    /**
     * Get a OAuthProvider.
     *
     * @return AbstractProvider
     */
    public function getProvider(): AbstractProvider
    {
        $class = $this->providerClass();

        return new $class([
            'clientId'     => $this->clientId,
            'clientSecret' => $this->clientSecret,
            'redirectUri'  => $this->redirectUrl,
        ]);
    }

    /**
     * Get the redirect URL.
     *
     * @return string
     */
    public function getRedirectUrl(): string
    {
        return $this->redirectUrl;
    }

    /**
     * End point for Requests.
     *
     * @return string
     */
    public function getEndPoint(): string
    {
        return $this->endPoint;
    }

    /**
     * Get access token for given code.
     *
     * @param string $code
     *
     * @return AccessToken
     */
    public function getAccessToken(string $code): AccessToken
    {
        return $this->getProvider()->getAccessToken(
            new AuthorizationCode(),
            [
                'code' => $code,
            ]
        );
    }

    /**
     * Give a new access token refreshed.
     *
     * @param AccessToken $token
     *
     * @return AccessToken
     */
    public function refreshAccessToken(AccessToken $token): AccessToken
    {
        return $this->refreshToken($token->getRefreshToken());
    }

    /**
     * Use the refresh token to get a new access token.
     *
     * @param string $refreshToken
     *
     * @return AccessToken
     */
    public function refreshToken(string $refreshToken): AccessToken
    {
        return $this->getProvider()->getAccessToken(
            new RefreshToken(),
            [
                'refresh_token' => $refreshToken,
            ]
        );
    }
}