diff --git a/src/Core/OAuth1Provider.php b/src/Core/OAuth1Provider.php index 6b2e5489..9821f6dd 100644 --- a/src/Core/OAuth1Provider.php +++ b/src/Core/OAuth1Provider.php @@ -60,7 +60,7 @@ public function getRequestToken():AccessToken{ ->withHeader('Content-Length', '0') // tumblr requires a content-length header set ; - foreach($this->authHeaders as $header => $value){ + foreach($this::HEADERS_AUTH as $header => $value){ $request = $request->withAddedHeader($header, $value); } diff --git a/src/Core/OAuth2Interface.php b/src/Core/OAuth2Interface.php index 79b039da..9fa58763 100644 --- a/src/Core/OAuth2Interface.php +++ b/src/Core/OAuth2Interface.php @@ -18,9 +18,49 @@ */ interface OAuth2Interface extends OAuthInterface{ + /** @var int */ public const AUTH_METHOD_HEADER = 1; + /** @var int */ public const AUTH_METHOD_QUERY = 2; + /** + * Specifies the authentication method: + * + * - OAuth2Interface::AUTH_METHOD_HEADER (Bearer, OAuth, ...) + * - OAuth2Interface::AUTH_METHOD_QUERY (access_token, ...) + * + * @var int + */ + public const AUTH_METHOD = self::AUTH_METHOD_HEADER; + + /** + * The name of the authentication header in case of OAuth2Interface::AUTH_METHOD_HEADER + * + * @var string + */ + public const AUTH_PREFIX_HEADER = 'Bearer'; + + /** + * The name of the authentication query parameter in case of OAuth2Interface::AUTH_METHOD_QUERY + * + * @var string + */ + public const AUTH_PREFIX_QUERY = 'access_token'; + + /** + * Default scopes to apply if none were provided via the $scopes parameter + * + * @var string[] + */ + public const DEFAULT_SCOPES = []; + + /** + * The delimiter string for scopes + * + * @var string + */ + public const SCOPE_DELIMITER = ' '; + /** * Obtains an OAuth2 access token with the given $code, verifies the $state * if the provider implements the CSRFToken interface, and returns an AccessToken object diff --git a/src/Core/OAuth2Provider.php b/src/Core/OAuth2Provider.php index f85e2aee..29b1e1f4 100644 --- a/src/Core/OAuth2Provider.php +++ b/src/Core/OAuth2Provider.php @@ -25,28 +25,6 @@ */ abstract class OAuth2Provider extends OAuthProvider implements OAuth2Interface{ - /** - * Specifies the authentication method: - * - OAuth2Interface::AUTH_METHOD_HEADER (Bearer, OAuth, ...) - * - OAuth2Interface::AUTH_METHOD_QUERY (access_token, ...) - */ - protected int $authMethod = self::AUTH_METHOD_HEADER; - - /** - * The name of the authentication header in case of OAuth2Interface::AUTH_METHOD_HEADER - */ - protected string $authMethodHeader = 'Bearer'; - - /** - * The name of the authentication query parameter in case of OAuth2Interface::AUTH_METHOD_QUERY - */ - protected string $authMethodQuery = 'access_token'; - - /** - * The delimiter string for scopes - */ - protected string $scopesDelimiter = ' '; - /** * An optional refresh token endpoint in case the provider supports TokenRefresh. * If the provider supports token refresh and $refreshTokenURL is null, $accessTokenURL will be used instead. @@ -61,17 +39,12 @@ abstract class OAuth2Provider extends OAuthProvider implements OAuth2Interface{ */ protected string|null $clientCredentialsTokenURL = null; - /** - * Default scopes to apply if none were provided via the $scopes parameter in OAuth2Provider::getAuthURL() - */ - protected array $defaultScopes = []; - /** * @inheritDoc */ public function getAuthURL(array|null $params = null, array|null $scopes = null):UriInterface{ $params ??= []; - $scopes ??= $this->defaultScopes; + $scopes ??= $this::DEFAULT_SCOPES; unset($params['client_secret']); @@ -83,7 +56,7 @@ public function getAuthURL(array|null $params = null, array|null $scopes = null) ]); if(!empty($scopes)){ - $params['scope'] = implode($this->scopesDelimiter, $scopes); + $params['scope'] = implode($this::SCOPE_DELIMITER, $scopes); } if($this instanceof CSRFToken){ @@ -128,7 +101,7 @@ protected function parseTokenResponse(ResponseInterface $response):AccessToken{ if(isset($data['scope']) || isset($data['scopes'])){ $scope = ($data['scope'] ?? $data['scopes'] ?? []); - $token->scopes = (is_array($scope)) ? $scope : explode($this->scopesDelimiter, $scope); + $token->scopes = (is_array($scope)) ? $scope : explode($this::SCOPE_DELIMITER, $scope); } unset($data['expires_in'], $data['refresh_token'], $data['access_token'], $data['scope'], $data['scopes']); @@ -161,7 +134,7 @@ public function getAccessToken(string $code, string|null $state = null):AccessTo ->withHeader('Accept-Encoding', 'identity') ->withBody($this->streamFactory->createStream(QueryUtil::build($body, PHP_QUERY_RFC1738))); - foreach($this->authHeaders as $header => $value){ + foreach($this::HEADERS_AUTH as $header => $value){ $request = $request->withHeader($header, $value); } @@ -177,17 +150,17 @@ public function getAccessToken(string $code, string|null $state = null):AccessTo */ public function getRequestAuthorization(RequestInterface $request, AccessToken $token):RequestInterface{ - if($this->authMethod === OAuth2Interface::AUTH_METHOD_HEADER){ - return $request->withHeader('Authorization', $this->authMethodHeader.' '.$token->accessToken); + if($this::AUTH_METHOD === OAuth2Interface::AUTH_METHOD_HEADER){ + return $request->withHeader('Authorization', $this::AUTH_PREFIX_HEADER.' '.$token->accessToken); } - if($this->authMethod === OAuth2Interface::AUTH_METHOD_QUERY){ - $uri = QueryUtil::merge((string)$request->getUri(), [$this->authMethodQuery => $token->accessToken]); + if($this::AUTH_METHOD === OAuth2Interface::AUTH_METHOD_QUERY){ + $uri = QueryUtil::merge((string)$request->getUri(), [$this::AUTH_PREFIX_QUERY => $token->accessToken]); return $request->withUri($this->uriFactory->createUri($uri)); } - throw new ProviderException('invalid auth type'); + throw new ProviderException('invalid auth AUTH_METHOD'); } /** @@ -203,7 +176,7 @@ public function getClientCredentialsToken(array|null $scopes = null):AccessToken $params = ['grant_type' => 'client_credentials']; if(!empty($scopes)){ - $params['scope'] = implode($this->scopesDelimiter, $scopes); + $params['scope'] = implode($this::SCOPE_DELIMITER, $scopes); } $request = $this->requestFactory @@ -214,7 +187,7 @@ public function getClientCredentialsToken(array|null $scopes = null):AccessToken ->withBody($this->streamFactory->createStream(QueryUtil::build($params, PHP_QUERY_RFC1738))) ; - foreach($this->authHeaders as $header => $value){ + foreach($this::HEADERS_AUTH as $header => $value){ $request = $request->withAddedHeader($header, $value); } @@ -267,7 +240,7 @@ public function refreshAccessToken(AccessToken|null $token = null):AccessToken{ ->withBody($this->streamFactory->createStream(QueryUtil::build($body, PHP_QUERY_RFC1738))) ; - foreach($this->authHeaders as $header => $value){ + foreach($this::HEADERS_AUTH as $header => $value){ $request = $request->withAddedHeader($header, $value); } diff --git a/src/Core/OAuthInterface.php b/src/Core/OAuthInterface.php index e8f7a57b..f8909e05 100644 --- a/src/Core/OAuthInterface.php +++ b/src/Core/OAuthInterface.php @@ -30,6 +30,20 @@ */ interface OAuthInterface extends ClientInterface{ + /** + * additional headers to use during authentication + * + * @var array + */ + public const HEADERS_AUTH = []; + + /** + * additional headers to use during API access + * + * @var array + */ + public const HEADERS_API = []; + /** * Prepares the URL with optional $params which redirects to the provider's authorization prompt * and returns a PSR-7 UriInterface with all necessary parameters set diff --git a/src/Core/OAuthProvider.php b/src/Core/OAuthProvider.php index 896380f1..5dc4862d 100644 --- a/src/Core/OAuthProvider.php +++ b/src/Core/OAuthProvider.php @@ -49,16 +49,6 @@ abstract class OAuthProvider implements OAuthInterface{ */ protected string $accessTokenURL; - /** - * additional headers to use during authentication - */ - protected array $authHeaders = []; - - /** - * additional headers to use during API access - */ - protected array $apiHeaders = []; - /* * magic properties (public readonly would be cool if the implementation wasn't fucking stupid) */ @@ -249,7 +239,8 @@ public function request( * Prepare request headers */ protected function getRequestHeaders(array|null $headers = null):array{ - return array_merge($this->apiHeaders, ($headers ?? [])); + /** @noinspection PhpParamsInspection sup PHPStorm?? */ + return array_merge($this::HEADERS_API, ($headers ?? [])); } /** diff --git a/src/Providers/Amazon.php b/src/Providers/Amazon.php index b4f06403..c0f056ae 100644 --- a/src/Providers/Amazon.php +++ b/src/Providers/Amazon.php @@ -29,7 +29,7 @@ class Amazon extends OAuth2Provider implements CSRFToken, TokenRefresh{ public const SCOPE_PROFILE_USER_ID = 'profile:user_id'; public const SCOPE_POSTAL_CODE = 'postal_code'; - protected array $defaultScopes = [ + public const DEFAULT_SCOPES = [ self::SCOPE_PROFILE, self::SCOPE_PROFILE_USER_ID, ]; diff --git a/src/Providers/BattleNet.php b/src/Providers/BattleNet.php index f60942de..82e950ed 100644 --- a/src/Providers/BattleNet.php +++ b/src/Providers/BattleNet.php @@ -23,12 +23,12 @@ */ class BattleNet extends OAuth2Provider implements ClientCredentials, CSRFToken{ - public const SCOPE_OPENID = 'openid'; - public const SCOPE_PROFILE_D3 = 'd3.profile'; - public const SCOPE_PROFILE_SC2 = 'sc2.profile'; - public const SCOPE_PROFILE_WOW = 'wow.profile'; + public const SCOPE_OPENID = 'openid'; + public const SCOPE_PROFILE_D3 = 'd3.profile'; + public const SCOPE_PROFILE_SC2 = 'sc2.profile'; + public const SCOPE_PROFILE_WOW = 'wow.profile'; - protected array $defaultScopes = [ + public const DEFAULT_SCOPES = [ self::SCOPE_OPENID, self::SCOPE_PROFILE_D3, self::SCOPE_PROFILE_SC2, diff --git a/src/Providers/BigCartel.php b/src/Providers/BigCartel.php index 7a1255f4..e669e8e5 100644 --- a/src/Providers/BigCartel.php +++ b/src/Providers/BigCartel.php @@ -24,6 +24,10 @@ */ class BigCartel extends OAuth2Provider implements CSRFToken, TokenInvalidate{ + public const HEADERS_API = [ + 'Accept' => 'application/vnd.api+json', + ]; + protected string $authURL = 'https://my.bigcartel.com/oauth/authorize'; protected string $accessTokenURL = 'https://api.bigcartel.com/oauth/token'; protected string $revokeURL = 'https://api.bigcartel.com/oauth/deauthorize/%s'; // sprintf() user id! @@ -31,7 +35,6 @@ class BigCartel extends OAuth2Provider implements CSRFToken, TokenInvalidate{ protected string|null $userRevokeURL = 'https://my.bigcartel.com/account'; protected string|null $apiDocs = 'https://developers.bigcartel.com/api/v1'; protected string|null $applicationURL = 'https://bigcartel.wufoo.com/forms/big-cartel-api-application/'; - protected array $apiHeaders = ['Accept' => 'application/vnd.api+json']; /** * @inheritDoc diff --git a/src/Providers/Deezer.php b/src/Providers/Deezer.php index 823ea4fa..d6f14215 100644 --- a/src/Providers/Deezer.php +++ b/src/Providers/Deezer.php @@ -24,15 +24,15 @@ */ class Deezer extends OAuth2Provider implements CSRFToken{ - public const SCOPE_BASIC = 'basic_access'; - public const SCOPE_EMAIL = 'email'; - public const SCOPE_OFFLINE_ACCESS = 'offline_access'; - public const SCOPE_MANAGE_LIBRARY = 'manage_library'; - public const SCOPE_MANAGE_COMMUNITY = 'manage_community'; - public const SCOPE_DELETE_LIBRARY = 'delete_library'; - public const SCOPE_LISTENING_HISTORY = 'listening_history'; - - protected array $defaultScopes = [ + public const SCOPE_BASIC = 'basic_access'; + public const SCOPE_EMAIL = 'email'; + public const SCOPE_OFFLINE_ACCESS = 'offline_access'; + public const SCOPE_MANAGE_LIBRARY = 'manage_library'; + public const SCOPE_MANAGE_COMMUNITY = 'manage_community'; + public const SCOPE_DELETE_LIBRARY = 'delete_library'; + public const SCOPE_LISTENING_HISTORY = 'listening_history'; + + public const DEFAULT_SCOPES = [ self::SCOPE_BASIC, self::SCOPE_EMAIL, self::SCOPE_OFFLINE_ACCESS, @@ -40,13 +40,14 @@ class Deezer extends OAuth2Provider implements CSRFToken{ self::SCOPE_LISTENING_HISTORY, ]; + public const AUTH_METHOD = self::AUTH_METHOD_QUERY; + protected string $authURL = 'https://connect.deezer.com/oauth/auth.php'; protected string $accessTokenURL = 'https://connect.deezer.com/oauth/access_token.php'; protected string $apiURL = 'https://api.deezer.com'; protected string|null $userRevokeURL = 'https://www.deezer.com/account/apps'; protected string|null $apiDocs = 'https://developers.deezer.com/api'; protected string|null $applicationURL = 'http://developers.deezer.com/myapps'; - protected int $authMethod = self::AUTH_METHOD_QUERY; /** * @inheritDoc @@ -61,7 +62,7 @@ public function getAuthURL(array|null $params = null, array|null $scopes = null) $params = array_merge($params, [ 'app_id' => $this->options->key, 'redirect_uri' => $this->options->callbackURL, - 'perms' => implode($this->scopesDelimiter, ($scopes ?? [])), + 'perms' => implode($this::SCOPE_DELIMITER, ($scopes ?? [])), ]); $params = $this->setState($params); diff --git a/src/Providers/DeviantArt.php b/src/Providers/DeviantArt.php index 119c3710..a3166433 100644 --- a/src/Providers/DeviantArt.php +++ b/src/Providers/DeviantArt.php @@ -21,23 +21,27 @@ */ class DeviantArt extends OAuth2Provider implements ClientCredentials, CSRFToken, TokenInvalidate, TokenRefresh{ - public const SCOPE_BASIC = 'basic'; - public const SCOPE_BROWSE = 'browse'; - public const SCOPE_COLLECTION = 'collection'; - public const SCOPE_COMMENT_POST = 'comment.post'; - public const SCOPE_FEED = 'feed'; - public const SCOPE_GALLERY = 'gallery'; - public const SCOPE_MESSAGE = 'message'; - public const SCOPE_NOTE = 'note'; - public const SCOPE_STASH = 'stash'; - public const SCOPE_USER = 'user'; - public const SCOPE_USER_MANAGE = 'user.manage'; - - protected array $defaultScopes = [ + public const SCOPE_BASIC = 'basic'; + public const SCOPE_BROWSE = 'browse'; + public const SCOPE_COLLECTION = 'collection'; + public const SCOPE_COMMENT_POST = 'comment.post'; + public const SCOPE_FEED = 'feed'; + public const SCOPE_GALLERY = 'gallery'; + public const SCOPE_MESSAGE = 'message'; + public const SCOPE_NOTE = 'note'; + public const SCOPE_STASH = 'stash'; + public const SCOPE_USER = 'user'; + public const SCOPE_USER_MANAGE = 'user.manage'; + + public const DEFAULT_SCOPES = [ self::SCOPE_BASIC, self::SCOPE_BROWSE, ]; + public const HEADERS_API = [ + 'dA-minor-version' => '20210526', + ]; + protected string $authURL = 'https://www.deviantart.com/oauth2/authorize'; protected string $accessTokenURL = 'https://www.deviantart.com/oauth2/token'; protected string $revokeURL = 'https://www.deviantart.com/oauth2/revoke'; @@ -45,7 +49,6 @@ class DeviantArt extends OAuth2Provider implements ClientCredentials, CSRFToken, protected string|null $userRevokeURL = 'https://www.deviantart.com/settings/applications'; protected string|null $apiDocs = 'https://www.deviantart.com/developers/'; protected string|null $applicationURL = 'https://www.deviantart.com/developers/apps'; - protected array $apiHeaders = ['dA-minor-version' => '20210526']; /** * @inheritDoc diff --git a/src/Providers/Discogs.php b/src/Providers/Discogs.php index 2465c08f..9498a9ff 100644 --- a/src/Providers/Discogs.php +++ b/src/Providers/Discogs.php @@ -21,15 +21,17 @@ */ class Discogs extends OAuth1Provider{ + public const HEADERS_API = [ + 'Accept' => 'application/vnd.discogs.v2.discogs+json', + ]; + protected string $requestTokenURL = 'https://api.discogs.com/oauth/request_token'; protected string $authURL = 'https://www.discogs.com/oauth/authorize'; protected string $accessTokenURL = 'https://api.discogs.com/oauth/access_token'; protected string $apiURL = 'https://api.discogs.com'; protected string|null $userRevokeURL = 'https://www.discogs.com/settings/applications'; protected string|null $apiDocs = 'https://www.discogs.com/developers/'; - protected string|null $applicationURL = 'https://www.discogs.com/settings/developers'; - protected array $apiHeaders = ['Accept' => 'application/vnd.discogs.v2.discogs+json']; - + protected string|null $applicationURL = 'https://www.discogs.com/settings/developers'; /** * @inheritDoc */ diff --git a/src/Providers/Discord.php b/src/Providers/Discord.php index 504e3180..faa64c9f 100644 --- a/src/Providers/Discord.php +++ b/src/Providers/Discord.php @@ -40,7 +40,7 @@ class Discord extends OAuth2Provider implements ClientCredentials, CSRFToken, To public const SCOPE_RPC_NOTIFICATIONS_READ = 'rpc.notifications.read'; public const SCOPE_WEBHOOK_INCOMING = 'webhook.incoming'; - protected array $defaultScopes = [ + public const DEFAULT_SCOPES = [ self::SCOPE_CONNECTIONS, self::SCOPE_EMAIL, self::SCOPE_IDENTIFY, diff --git a/src/Providers/Foursquare.php b/src/Providers/Foursquare.php index 2c2ed698..efc49c94 100644 --- a/src/Providers/Foursquare.php +++ b/src/Providers/Foursquare.php @@ -21,6 +21,9 @@ */ class Foursquare extends OAuth2Provider{ + public const AUTH_METHOD = self::AUTH_METHOD_QUERY; + public const AUTH_PREFIX_QUERY = 'oauth_token'; + protected const API_VERSIONDATE = '20190225'; protected string $authURL = 'https://foursquare.com/oauth2/authenticate'; @@ -29,8 +32,6 @@ class Foursquare extends OAuth2Provider{ protected string|null $userRevokeURL = 'https://foursquare.com/settings/connections'; protected string|null $apiDocs = 'https://developer.foursquare.com/docs'; protected string|null $applicationURL = 'https://foursquare.com/developers/apps'; - protected string $authMethodQuery = 'oauth_token'; - protected int $authMethod = self::AUTH_METHOD_QUERY; /** * @inheritDoc diff --git a/src/Providers/GitHub.php b/src/Providers/GitHub.php index 4e0fa24f..e130f2f6 100644 --- a/src/Providers/GitHub.php +++ b/src/Providers/GitHub.php @@ -47,21 +47,27 @@ class GitHub extends OAuth2Provider implements CSRFToken, TokenRefresh{ public const SCOPE_GPG_KEY_WRITE = 'write:gpg_key'; public const SCOPE_GPG_KEY_ADMIN = 'admin:gpg_key'; - protected array $defaultScopes = [ + public const DEFAULT_SCOPES = [ self::SCOPE_USER, self::SCOPE_USER_EMAIL, self::SCOPE_PUBLIC_REPO, self::SCOPE_GIST, ]; + public const HEADERS_AUTH = [ + 'Accept' => 'application/json', + ]; + + public const HEADERS_API = [ + 'Accept' => 'application/vnd.github.beta+json', + ]; + protected string $authURL = 'https://github.com/login/oauth/authorize'; protected string $accessTokenURL = 'https://github.com/login/oauth/access_token'; protected string $apiURL = 'https://api.github.com'; protected string|null $userRevokeURL = 'https://github.com/settings/applications'; protected string|null $apiDocs = 'https://developer.github.com/'; protected string|null $applicationURL = 'https://github.com/settings/developers'; - protected array $authHeaders = ['Accept' => 'application/json']; - protected array $apiHeaders = ['Accept' => 'application/vnd.github.beta+json']; /** * @inheritDoc diff --git a/src/Providers/Google.php b/src/Providers/Google.php index 1d3e4cad..7163e2b5 100644 --- a/src/Providers/Google.php +++ b/src/Providers/Google.php @@ -27,7 +27,7 @@ class Google extends OAuth2Provider implements CSRFToken{ public const SCOPE_USERINFO_EMAIL = 'https://www.googleapis.com/auth/userinfo.email'; public const SCOPE_USERINFO_PROFILE = 'https://www.googleapis.com/auth/userinfo.profile'; - protected array $defaultScopes = [ + public const DEFAULT_SCOPES = [ self::SCOPE_EMAIL, self::SCOPE_PROFILE, ]; diff --git a/src/Providers/GuildWars2.php b/src/Providers/GuildWars2.php index 6e6ee3b9..777ffb85 100644 --- a/src/Providers/GuildWars2.php +++ b/src/Providers/GuildWars2.php @@ -23,18 +23,18 @@ */ class GuildWars2 extends OAuth2Provider{ - public const SCOPE_ACCOUNT = 'account'; - public const SCOPE_INVENTORIES = 'inventories'; - public const SCOPE_CHARACTERS = 'characters'; - public const SCOPE_TRADINGPOST = 'tradingpost'; - public const SCOPE_WALLET = 'wallet'; - public const SCOPE_UNLOCKS = 'unlocks'; - public const SCOPE_PVP = 'pvp'; - public const SCOPE_BUILDS = 'builds'; - public const SCOPE_PROGRESSION = 'progression'; - public const SCOPE_GUILDS = 'guilds'; - - protected const AUTH_ERRMSG = 'GuildWars2 does not support authentication anymore.'; + public const SCOPE_ACCOUNT = 'account'; + public const SCOPE_INVENTORIES = 'inventories'; + public const SCOPE_CHARACTERS = 'characters'; + public const SCOPE_TRADINGPOST = 'tradingpost'; + public const SCOPE_WALLET = 'wallet'; + public const SCOPE_UNLOCKS = 'unlocks'; + public const SCOPE_PVP = 'pvp'; + public const SCOPE_BUILDS = 'builds'; + public const SCOPE_PROGRESSION = 'progression'; + public const SCOPE_GUILDS = 'guilds'; + + protected const AUTH_ERRMSG = 'GuildWars2 does not support authentication anymore.'; protected string $authURL = 'https://api.guildwars2.com/v2/tokeninfo'; protected string $apiURL = 'https://api.guildwars2.com'; @@ -71,7 +71,7 @@ public function storeGW2Token(string $access_token):AccessToken{ 'token_type' => 'Bearer', 'id' => $tokeninfo->id, 'name' => $tokeninfo->name, - 'scope' => implode($this->scopesDelimiter, $tokeninfo->permissions), + 'scope' => implode($this::SCOPE_DELIMITER, $tokeninfo->permissions), ]; $this->storage->storeAccessToken($token, $this->serviceName); diff --git a/src/Providers/LastFM.php b/src/Providers/LastFM.php index 3683265e..eea2e60c 100644 --- a/src/Providers/LastFM.php +++ b/src/Providers/LastFM.php @@ -28,7 +28,8 @@ class LastFM extends OAuthProvider{ public const PERIOD_3MONTH = '3month'; public const PERIOD_6MONTH = '6month'; public const PERIOD_12MONTH = '12month'; - public const PERIODS = [ + + public const PERIODS = [ self::PERIOD_OVERALL, self::PERIOD_7DAY, self::PERIOD_1MONTH, @@ -169,7 +170,7 @@ public function request( /** @phan-suppress-next-line PhanTypeMismatchArgumentNullable */ $request = $this->requestFactory->createRequest($method, QueryUtil::merge($this->apiURL, $params)); - foreach(array_merge($this->apiHeaders, ($headers ?? [])) as $header => $value){ + foreach(array_merge($this::HEADERS_API, ($headers ?? [])) as $header => $value){ $request = $request->withAddedHeader($header, $value); } diff --git a/src/Providers/MailChimp.php b/src/Providers/MailChimp.php index 1908f165..bd7f7bab 100644 --- a/src/Providers/MailChimp.php +++ b/src/Providers/MailChimp.php @@ -22,14 +22,13 @@ */ class MailChimp extends OAuth2Provider implements CSRFToken{ - protected const API_BASE = 'https://%s.api.mailchimp.com'; - protected const METADATA_ENDPOINT = 'https://login.mailchimp.com/oauth2/metadata'; - - protected string $authURL = 'https://login.mailchimp.com/oauth2/authorize'; - protected string $accessTokenURL = 'https://login.mailchimp.com/oauth2/token'; - protected string|null $apiDocs = 'https://developer.mailchimp.com/'; - protected string|null $applicationURL = 'https://admin.mailchimp.com/account/oauth2/'; - protected string $authMethodHeader = 'OAuth'; + protected const API_BASE = 'https://%s.api.mailchimp.com'; + protected const METADATA_ENDPOINT = 'https://login.mailchimp.com/oauth2/metadata'; + + protected string $authURL = 'https://login.mailchimp.com/oauth2/authorize'; + protected string $accessTokenURL = 'https://login.mailchimp.com/oauth2/token'; + protected string|null $apiDocs = 'https://developer.mailchimp.com/'; + protected string|null $applicationURL = 'https://admin.mailchimp.com/account/oauth2/'; /** * @throws \chillerlan\OAuth\OAuthException diff --git a/src/Providers/Mastodon.php b/src/Providers/Mastodon.php index e01ddabd..9978ad64 100644 --- a/src/Providers/Mastodon.php +++ b/src/Providers/Mastodon.php @@ -28,14 +28,13 @@ class Mastodon extends OAuth2Provider implements CSRFToken, TokenRefresh{ public const SCOPE_FOLLOW = 'follow'; public const SCOPE_PUSH = 'push'; - protected string|null $apiDocs = 'https://docs.joinmastodon.org/api/'; - - protected array $defaultScopes = [ + public const DEFAULT_SCOPES = [ self::SCOPE_READ, self::SCOPE_FOLLOW, ]; - protected string $instance = ''; + protected string|null $apiDocs = 'https://docs.joinmastodon.org/api/'; + protected string $instance = ''; /** * set the internal URLs for the given Mastodon instance diff --git a/src/Providers/MicrosoftGraph.php b/src/Providers/MicrosoftGraph.php index fb58d334..3860fca9 100644 --- a/src/Providers/MicrosoftGraph.php +++ b/src/Providers/MicrosoftGraph.php @@ -22,7 +22,7 @@ class MicrosoftGraph extends AzureActiveDirectory{ public const SCOPE_USER_READ = 'User.Read'; public const SCOPE_USER_READBASIC_ALL = 'User.ReadBasic.All'; - protected array $defaultScopes = [ + public const DEFAULT_SCOPES = [ self::SCOPE_OPENID, self::SCOPE_OPENID_EMAIL, self::SCOPE_OPENID_PROFILE, diff --git a/src/Providers/Mixcloud.php b/src/Providers/Mixcloud.php index c3f08f70..f246c846 100644 --- a/src/Providers/Mixcloud.php +++ b/src/Providers/Mixcloud.php @@ -22,13 +22,14 @@ */ class Mixcloud extends OAuth2Provider{ + public const AUTH_METHOD = self::AUTH_METHOD_QUERY; + protected string $authURL = 'https://www.mixcloud.com/oauth/authorize'; protected string $accessTokenURL = 'https://www.mixcloud.com/oauth/access_token'; protected string $apiURL = 'https://api.mixcloud.com'; protected string|null $userRevokeURL = 'https://www.mixcloud.com/settings/applications/'; protected string|null $apiDocs = 'https://www.mixcloud.com/developers/'; protected string|null $applicationURL = 'https://www.mixcloud.com/developers/create/'; - protected int $authMethod = self::AUTH_METHOD_QUERY; /** * @inheritDoc diff --git a/src/Providers/MusicBrainz.php b/src/Providers/MusicBrainz.php index 669332d0..e6425326 100644 --- a/src/Providers/MusicBrainz.php +++ b/src/Providers/MusicBrainz.php @@ -30,7 +30,7 @@ class MusicBrainz extends OAuth2Provider implements CSRFToken, TokenRefresh{ public const SCOPE_SUBMIT_ISRC = 'submit_isrc'; public const SCOPE_SUBMIT_BARCODE = 'submit_barcode'; - protected array $defaultScopes = [ + public const DEFAULT_SCOPES = [ self::SCOPE_PROFILE, self::SCOPE_EMAIL, self::SCOPE_TAG, diff --git a/src/Providers/NPROne.php b/src/Providers/NPROne.php index 04717ecd..e192b952 100644 --- a/src/Providers/NPROne.php +++ b/src/Providers/NPROne.php @@ -27,7 +27,7 @@ class NPROne extends OAuth2Provider implements CSRFToken, TokenRefresh, TokenInv public const SCOPE_LISTENING_WRITE = 'listening.write'; public const SCOPE_LOCALACTIVATION = 'localactivation'; - protected array $defaultScopes = [ + public const DEFAULT_SCOPES = [ self::SCOPE_IDENTITY_READONLY, self::SCOPE_LISTENING_READONLY, ]; diff --git a/src/Providers/OpenCaching.php b/src/Providers/OpenCaching.php index ccac33e8..c84b754f 100644 --- a/src/Providers/OpenCaching.php +++ b/src/Providers/OpenCaching.php @@ -13,13 +13,19 @@ use chillerlan\HTTP\Utils\MessageUtil; use chillerlan\OAuth\Core\{OAuth1Provider}; use Psr\Http\Message\ResponseInterface; -use function sprintf; +use function implode, sprintf; /** * @see https://www.opencaching.de/okapi/ */ class OpenCaching extends OAuth1Provider{ + protected const USER_FIELDS = [ + 'uuid', 'username', 'profile_url', 'internal_id', 'date_registered', + 'caches_found', 'caches_notfound', 'caches_hidden', 'rcmds_given', + 'rcmds_left', 'rcmd_founds_needed', 'home_location', + ]; + protected string $requestTokenURL = 'https://www.opencaching.de/okapi/services/oauth/request_token'; protected string $authURL = 'https://www.opencaching.de/okapi/services/oauth/authorize'; protected string $accessTokenURL = 'https://www.opencaching.de/okapi/services/oauth/access_token'; @@ -32,7 +38,7 @@ class OpenCaching extends OAuth1Provider{ * @inheritDoc */ public function me():ResponseInterface{ - $response = $this->request('/users/user', ['fields' => 'uuid|username|profile_url|internal_id|date_registered|caches_found|caches_notfound|caches_hidden|rcmds_given|rcmds_left|rcmd_founds_needed|home_location']); + $response = $this->request('/users/user', ['fields' => implode('|', $this::USER_FIELDS)]); $status = $response->getStatusCode(); if($status === 200){ diff --git a/src/Providers/OpenStreetmap2.php b/src/Providers/OpenStreetmap2.php index baec444e..c66981d3 100644 --- a/src/Providers/OpenStreetmap2.php +++ b/src/Providers/OpenStreetmap2.php @@ -36,7 +36,7 @@ class OpenStreetmap2 extends OAuth2Provider implements CSRFToken{ public const SCOPE_WRITE_REDACTIONS = 'write_redactions'; public const SCOPE_OPENID = 'openid'; - protected array $defaultScopes = [ + public const DEFAULT_SCOPES = [ self::SCOPE_READ_GPX, self::SCOPE_READ_PREFS, ]; diff --git a/src/Providers/Patreon.php b/src/Providers/Patreon.php index 1d673bf8..aeca6483 100644 --- a/src/Providers/Patreon.php +++ b/src/Providers/Patreon.php @@ -36,7 +36,7 @@ class Patreon extends OAuth2Provider implements CSRFToken, TokenRefresh{ public const SCOPE_V2_CAMPAIGNS_MEMBERS_EMAIL = 'campaigns.members[email]'; public const SCOPE_V2_CAMPAIGNS_MEMBERS_ADDRESS = 'campaigns.members.address'; - protected array $defaultScopes = [ + public const DEFAULT_SCOPES = [ self::SCOPE_V2_IDENTITY, self::SCOPE_V2_IDENTITY_EMAIL, self::SCOPE_V2_IDENTITY_MEMBERSHIPS, diff --git a/src/Providers/PayPal.php b/src/Providers/PayPal.php index 0cf805c1..3e6a6488 100644 --- a/src/Providers/PayPal.php +++ b/src/Providers/PayPal.php @@ -27,7 +27,7 @@ class PayPal extends OAuth2Provider implements ClientCredentials, CSRFToken, Tok public const SCOPE_ADDRESS = 'address'; public const SCOPE_ACCOUNT = 'https://uri.paypal.com/services/paypalattributes'; - protected array $defaultScopes = [ + public const DEFAULT_SCOPES = [ self::SCOPE_BASIC_AUTH, self::SCOPE_EMAIL, ]; @@ -73,7 +73,7 @@ protected function parseTokenResponse(ResponseInterface $response):AccessToken{ $token->accessToken = $data['access_token']; $token->expires = ($data['expires_in'] ?? AccessToken::EOL_NEVER_EXPIRES); $token->refreshToken = ($data['refresh_token'] ?? null); - $token->scopes = explode($this->scopesDelimiter, ($data['scope'] ?? '')); + $token->scopes = explode($this::SCOPE_DELIMITER, ($data['scope'] ?? '')); unset($data['expires_in'], $data['refresh_token'], $data['access_token'], $data['scope']); diff --git a/src/Providers/Slack.php b/src/Providers/Slack.php index 8e1240b4..f7cf4a4c 100644 --- a/src/Providers/Slack.php +++ b/src/Providers/Slack.php @@ -78,7 +78,7 @@ class Slack extends OAuth2Provider implements CSRFToken{ public const SCOPE_USERS_READ_EMAIL = 'users:read.email'; public const SCOPE_USERS_WRITE = 'users:write'; - protected array $defaultScopes = [ + public const DEFAULT_SCOPES = [ self::SCOPE_IDENTITY_AVATAR, self::SCOPE_IDENTITY_BASIC, self::SCOPE_IDENTITY_EMAIL, diff --git a/src/Providers/SoundCloud.php b/src/Providers/SoundCloud.php index 882ccf24..37edf06c 100644 --- a/src/Providers/SoundCloud.php +++ b/src/Providers/SoundCloud.php @@ -25,17 +25,18 @@ class SoundCloud extends OAuth2Provider implements ClientCredentials, TokenRefre public const SCOPE_NONEXPIRING = 'non-expiring'; # public const SCOPE_EMAIL = 'email'; // ??? - protected array $defaultScopes = [ + public const DEFAULT_SCOPES = [ self::SCOPE_NONEXPIRING, ]; - protected string $authURL = 'https://api.soundcloud.com/connect'; - protected string $accessTokenURL = 'https://api.soundcloud.com/oauth2/token'; - protected string $apiURL = 'https://api.soundcloud.com'; - protected string|null $userRevokeURL = 'https://soundcloud.com/settings/connections'; - protected string|null $apiDocs = 'https://developers.soundcloud.com/'; - protected string|null $applicationURL = 'https://soundcloud.com/you/apps'; - protected string $authMethodHeader = 'OAuth'; + public const AUTH_PREFIX_HEADER = 'OAuth'; + + protected string $authURL = 'https://api.soundcloud.com/connect'; + protected string $accessTokenURL = 'https://api.soundcloud.com/oauth2/token'; + protected string $apiURL = 'https://api.soundcloud.com'; + protected string|null $userRevokeURL = 'https://soundcloud.com/settings/connections'; + protected string|null $apiDocs = 'https://developers.soundcloud.com/'; + protected string|null $applicationURL = 'https://soundcloud.com/you/apps'; /** * @inheritDoc diff --git a/src/Providers/Spotify.php b/src/Providers/Spotify.php index c0fb4a45..924c8793 100644 --- a/src/Providers/Spotify.php +++ b/src/Providers/Spotify.php @@ -59,7 +59,7 @@ class Spotify extends OAuth2Provider implements ClientCredentials, CSRFToken, To public const SCOPE_USER_MANAGE_PARTNER = 'user-manage-partner'; public const SCOPE_USER_CREATE_PARTNER = 'user-create-partner'; - protected array $defaultScopes = [ + public const DEFAULT_SCOPES = [ self::SCOPE_PLAYLIST_READ_COLLABORATIVE, self::SCOPE_PLAYLIST_MODIFY_PUBLIC, self::SCOPE_USER_FOLLOW_MODIFY, diff --git a/src/Providers/SteamOpenID.php b/src/Providers/SteamOpenID.php index f663b967..70d0c56a 100644 --- a/src/Providers/SteamOpenID.php +++ b/src/Providers/SteamOpenID.php @@ -29,11 +29,12 @@ class SteamOpenID extends OAuthProvider{ protected string|null $apiDocs = 'https://developer.valvesoftware.com/wiki/Steam_Web_API'; /** + * we ignore user supplied params here + * * @inheritDoc */ public function getAuthURL(array|null $params = null):UriInterface{ - // we ignore user supplied params here $params = [ 'openid.ns' => 'http://specs.openid.net/auth/2.0', 'openid.mode' => 'checkid_setup', diff --git a/src/Providers/Stripe.php b/src/Providers/Stripe.php index 94d373f9..efb2c841 100644 --- a/src/Providers/Stripe.php +++ b/src/Providers/Stripe.php @@ -24,10 +24,10 @@ */ class Stripe extends OAuth2Provider implements CSRFToken, TokenRefresh, TokenInvalidate{ - public const SCOPE_READ_WRITE = 'read_write'; - public const SCOPE_READ_ONLY = 'read_only'; + public const SCOPE_READ_WRITE = 'read_write'; + public const SCOPE_READ_ONLY = 'read_only'; - protected array $defaultScopes = [ + public const DEFAULT_SCOPES = [ self::SCOPE_READ_ONLY, ]; diff --git a/src/Providers/Tumblr2.php b/src/Providers/Tumblr2.php index 1036c2cd..cfaf1a7e 100644 --- a/src/Providers/Tumblr2.php +++ b/src/Providers/Tumblr2.php @@ -26,7 +26,7 @@ class Tumblr2 extends OAuth2Provider implements CSRFToken, TokenRefresh{ public const SCOPE_WRITE = 'write'; public const SCOPE_OFFLINE_ACCESS = 'offline_access'; - protected array $defaultScopes = [ + public const DEFAULT_SCOPES = [ self::SCOPE_BASIC, self::SCOPE_WRITE, self::SCOPE_OFFLINE_ACCESS, diff --git a/src/Providers/Twitch.php b/src/Providers/Twitch.php index 279046cf..1950bdce 100644 --- a/src/Providers/Twitch.php +++ b/src/Providers/Twitch.php @@ -45,10 +45,18 @@ class Twitch extends OAuth2Provider implements ClientCredentials, CSRFToken, Tok public const SCOPE_USER_READ_EMAIL = 'user:read:email'; public const SCOPE_USER_READ_SUBSCRIPTIONS = 'user:read:subscriptions'; - protected array $defaultScopes = [ + public const DEFAULT_SCOPES = [ self::SCOPE_USER_READ_EMAIL, ]; + public const HEADERS_AUTH = [ + 'Accept' => 'application/vnd.twitchtv.v5+json', + ]; + + public const HEADERS_API = [ + 'Accept' => 'application/vnd.twitchtv.v5+json', + ]; + protected string $authURL = 'https://id.twitch.tv/oauth2/authorize'; protected string $accessTokenURL = 'https://id.twitch.tv/oauth2/token'; protected string $revokeURL = 'https://id.twitch.tv/oauth2/revoke'; @@ -56,8 +64,6 @@ class Twitch extends OAuth2Provider implements ClientCredentials, CSRFToken, Tok protected string|null $userRevokeURL = 'https://www.twitch.tv/settings/connections'; protected string|null $apiDocs = 'https://dev.twitch.tv/docs/api/reference/'; protected string|null $applicationURL = 'https://dev.twitch.tv/console/apps/create'; - protected array $authHeaders = ['Accept' => 'application/vnd.twitchtv.v5+json']; - protected array $apiHeaders = ['Accept' => 'application/vnd.twitchtv.v5+json']; /** * @see https://dev.twitch.tv/docs/authentication#oauth-client-credentials-flow-app-access-tokens @@ -71,7 +77,7 @@ public function getClientCredentialsToken(array|null $scopes = null):AccessToken ]; if($scopes !== null){ - $params['scope'] = implode($this->scopesDelimiter, $scopes); + $params['scope'] = implode($this::SCOPE_DELIMITER, $scopes); } $request = $this->requestFactory @@ -80,7 +86,7 @@ public function getClientCredentialsToken(array|null $scopes = null):AccessToken ->withBody($this->streamFactory->createStream(QueryUtil::build($params, PHP_QUERY_RFC1738))) ; - foreach($this->authHeaders as $header => $value){ + foreach($this::HEADERS_AUTH as $header => $value){ $request = $request->withAddedHeader($header, $value); } @@ -96,7 +102,7 @@ public function getClientCredentialsToken(array|null $scopes = null):AccessToken */ public function getRequestAuthorization(RequestInterface $request, AccessToken $token):RequestInterface{ return $request - ->withHeader('Authorization', $this->authMethodHeader.' '.$token->accessToken) + ->withHeader('Authorization', $this::AUTH_PREFIX_HEADER.' '.$token->accessToken) ->withHeader('Client-ID', $this->options->key); } diff --git a/src/Providers/Twitter.php b/src/Providers/Twitter.php index aa579740..9c9f7c7b 100644 --- a/src/Providers/Twitter.php +++ b/src/Providers/Twitter.php @@ -25,9 +25,9 @@ class Twitter extends OAuth1Provider{ // choose your fighter /** @see https://developer.twitter.com/en/docs/basics/authentication/api-reference/authorize */ - protected string $authURL = 'https://api.twitter.com/oauth/authorize'; + protected string $authURL = 'https://api.twitter.com/oauth/authorize'; /** @see https://developer.twitter.com/en/docs/basics/authentication/api-reference/authenticate */ -# protected string $authURL = 'https://api.twitter.com/oauth/authenticate'; +# protected string $authURL = 'https://api.twitter.com/oauth/authenticate'; protected string $requestTokenURL = 'https://api.twitter.com/oauth/request_token'; protected string $accessTokenURL = 'https://api.twitter.com/oauth/access_token'; diff --git a/src/Providers/TwitterCC.php b/src/Providers/TwitterCC.php index 957f7cca..426b7e3f 100644 --- a/src/Providers/TwitterCC.php +++ b/src/Providers/TwitterCC.php @@ -23,7 +23,7 @@ */ class TwitterCC extends OAuth2Provider implements ClientCredentials{ - protected const AUTH_ERRMSG = 'TwitterCC only supports Client Credentials Grant, use the Twitter OAuth1 class for authentication instead.'; + protected const AUTH_ERRMSG = 'TwitterCC only supports Client Credentials Grant, use the Twitter OAuth1 class for authentication instead.'; protected string $apiURL = 'https://api.twitter.com'; protected string|null $clientCredentialsTokenURL = 'https://api.twitter.com/oauth2/token'; diff --git a/src/Providers/Vimeo.php b/src/Providers/Vimeo.php index efb5d828..a200d865 100644 --- a/src/Providers/Vimeo.php +++ b/src/Providers/Vimeo.php @@ -36,16 +36,24 @@ class Vimeo extends OAuth2Provider implements ClientCredentials, CSRFToken, Toke public const SCOPE_PROMO_CODES = 'promo_codes'; public const SCOPE_VIDEO_FILES = 'video_files'; - // @see https://developer.vimeo.com/api/changelog - protected const API_VERSION = '3.4'; - - protected array $defaultScopes = [ + public const DEFAULT_SCOPES = [ self::SCOPE_PUBLIC, self::SCOPE_PRIVATE, self::SCOPE_INTERACT, self::SCOPE_STATS, ]; + // @see https://developer.vimeo.com/api/changelog + protected const API_VERSION = '3.4'; + + public const HEADERS_AUTH = [ + 'Accept' => 'application/vnd.vimeo.*+json;version='.self::API_VERSION, + ]; + + public const HEADERS_API = [ + 'Accept' => 'application/vnd.vimeo.*+json;version='.self::API_VERSION, + ]; + protected string $authURL = 'https://api.vimeo.com/oauth/authorize'; protected string $accessTokenURL = 'https://api.vimeo.com/oauth/access_token'; protected string $revokeURL = 'https://api.vimeo.com/tokens'; @@ -54,8 +62,6 @@ class Vimeo extends OAuth2Provider implements ClientCredentials, CSRFToken, Toke protected string|null $clientCredentialsTokenURL = 'https://api.vimeo.com/oauth/authorize/client'; protected string|null $apiDocs = 'https://developer.vimeo.com'; protected string|null $applicationURL = 'https://developer.vimeo.com/apps'; - protected array $authHeaders = ['Accept' => 'application/vnd.vimeo.*+json;version='.self::API_VERSION]; - protected array $apiHeaders = ['Accept' => 'application/vnd.vimeo.*+json;version='.self::API_VERSION]; /** * @inheritDoc diff --git a/src/Providers/WordPress.php b/src/Providers/WordPress.php index 82b7fbd1..8f6e1aa9 100644 --- a/src/Providers/WordPress.php +++ b/src/Providers/WordPress.php @@ -23,7 +23,7 @@ class WordPress extends OAuth2Provider implements CSRFToken{ public const SCOPE_AUTH = 'auth'; public const SCOPE_GLOBAL = 'global'; - protected array $defaultScopes = [ + public const DEFAULT_SCOPES = [ self::SCOPE_GLOBAL, ]; diff --git a/tests/Core/DummyOAuth1Provider.php b/tests/Core/DummyOAuth1Provider.php index 1be97cb8..a3e2a6e4 100644 --- a/tests/Core/DummyOAuth1Provider.php +++ b/tests/Core/DummyOAuth1Provider.php @@ -19,14 +19,15 @@ */ final class DummyOAuth1Provider extends OAuth1Provider implements TokenInvalidate{ - protected string $authURL = 'https://example.com/oauth/authorize'; - protected string $accessTokenURL = 'https://example.com/oauth/access_token'; - protected string $requestTokenURL = 'https://example.com/oauth/request_token'; - protected string $revokeURL = 'https://example.com/oauth/revoke'; - protected string $apiURL = 'https://api.example.com'; - protected ?string $userRevokeURL = 'https://account.example.com/apps/'; - protected array $authHeaders = ['foo' => 'bar']; - protected array $apiHeaders = ['foo' => 'bar']; + public const HEADERS_AUTH = ['foo' => 'bar']; + public const HEADERS_API = ['foo' => 'bar']; + + protected string $authURL = 'https://example.com/oauth/authorize'; + protected string $accessTokenURL = 'https://example.com/oauth/access_token'; + protected string $requestTokenURL = 'https://example.com/oauth/request_token'; + protected string $revokeURL = 'https://example.com/oauth/revoke'; + protected string $apiURL = 'https://api.example.com'; + protected string|null $userRevokeURL = 'https://account.example.com/apps/'; /** * @inheritDoc diff --git a/tests/Core/DummyOAuth2BasicProvider.php b/tests/Core/DummyOAuth2BasicProvider.php index f98600a6..a660f3d0 100644 --- a/tests/Core/DummyOAuth2BasicProvider.php +++ b/tests/Core/DummyOAuth2BasicProvider.php @@ -18,9 +18,9 @@ */ final class DummyOAuth2BasicProvider extends OAuth2Provider{ - protected string $authURL = 'https://example.com/oauth2/authorize'; - protected string $accessTokenURL = 'https://example.com/oauth2/token'; - protected string $apiURL = 'https://api.example.com/'; - protected ?string $userRevokeURL = 'https://account.example.com/apps/'; + protected string $authURL = 'https://example.com/oauth2/authorize'; + protected string $accessTokenURL = 'https://example.com/oauth2/token'; + protected string $apiURL = 'https://api.example.com/'; + protected string|null $userRevokeURL = 'https://account.example.com/apps/'; } diff --git a/tests/Core/DummyOAuth2Provider.php b/tests/Core/DummyOAuth2Provider.php index 0938d35e..dd85929c 100644 --- a/tests/Core/DummyOAuth2Provider.php +++ b/tests/Core/DummyOAuth2Provider.php @@ -19,14 +19,15 @@ */ final class DummyOAuth2Provider extends OAuth2Provider implements ClientCredentials, CSRFToken, TokenRefresh, TokenInvalidate{ - protected string $authURL = 'https://example.com/oauth2/authorize'; - protected string $accessTokenURL = 'https://example.com/oauth2/token'; - protected string $revokeURL = 'https://example.com/oauth2/revoke'; - protected string $apiURL = 'https://api.example.com/'; - protected ?string $userRevokeURL = 'https://account.example.com/apps/'; - protected array $authHeaders = ['foo' => 'bar']; - protected array $apiHeaders = ['foo' => 'bar']; - protected int $authMethod = self::AUTH_METHOD_QUERY; + public const AUTH_METHOD = self::AUTH_METHOD_QUERY; + public const HEADERS_AUTH = ['foo' => 'bar']; + public const HEADERS_API = ['foo' => 'bar']; + + protected string $authURL = 'https://example.com/oauth2/authorize'; + protected string $accessTokenURL = 'https://example.com/oauth2/token'; + protected string $revokeURL = 'https://example.com/oauth2/revoke'; + protected string $apiURL = 'https://api.example.com/'; + protected string|null $userRevokeURL = 'https://account.example.com/apps/'; /** * @inheritDoc diff --git a/tests/Providers/OAuth2ProviderTestAbstract.php b/tests/Providers/OAuth2ProviderTestAbstract.php index ea50163e..909ef3d9 100644 --- a/tests/Providers/OAuth2ProviderTestAbstract.php +++ b/tests/Providers/OAuth2ProviderTestAbstract.php @@ -107,19 +107,19 @@ public function testGetRequestAuthorization():void{ $request = $this->requestFactory->createRequest('GET', 'https://foo.bar'); $token = new AccessToken(['accessTokenSecret' => 'test_token_secret', 'accessToken' => 'test_token']); - $authMethod = $this->getReflectionProperty('authMethod'); + $authMethod = $this->provider::AUTH_METHOD; // header (default) if($authMethod === OAuth2Interface::AUTH_METHOD_HEADER){ $this::assertStringContainsString( - $this->getReflectionProperty('authMethodHeader').' test_token', + $this->provider::AUTH_PREFIX_HEADER.' test_token', $this->provider->getRequestAuthorization($request, $token)->getHeaderLine('Authorization') ); } // query elseif($authMethod === OAuth2Interface::AUTH_METHOD_QUERY){ $this::assertStringContainsString( - $this->getReflectionProperty('authMethodQuery').'=test_token', + $this->provider::AUTH_PREFIX_QUERY.'=test_token', $this->provider->getRequestAuthorization($request, $token)->getUri()->getQuery() ); } @@ -133,18 +133,6 @@ public function testRequest():void{ $this::assertSame('such data! much wow!', MessageUtil::decodeJSON($this->provider->request('/request'))->data); } - public function testRequestInvalidAuthTypeException():void{ - $this->expectException(OAuthException::class); - $this->expectExceptionMessage('invalid auth type'); - - $this->setReflectionProperty('authMethod', -1); - - $token = new AccessToken(['accessToken' => 'test_access_token_secret', 'expires' => 1]); - $this->provider->storeAccessToken($token); - - $this->provider->request('/request'); - } - public function testCheckCSRFState():void{ if(!$this->provider instanceof CSRFToken){ diff --git a/tests/Providers/Unit/MailChimpTest.php b/tests/Providers/Unit/MailChimpTest.php index 397f38df..2116117c 100644 --- a/tests/Providers/Unit/MailChimpTest.php +++ b/tests/Providers/Unit/MailChimpTest.php @@ -56,17 +56,6 @@ public function testRequest():void{ $this::assertSame('such data! much wow! (/3.0/)', MessageUtil::decodeJSON($this->provider->request('/3.0/'))->data); } - public function testRequestInvalidAuthTypeException():void{ - $this->expectException(OAuthException::class); - $this->expectExceptionMessage('invalid auth type'); - - $this->setReflectionProperty('authMethod', -1); - - $this->storage->storeAccessToken($this->token, $this->provider->serviceName); - - $this->provider->request(''); - } - public function testGetTokenMetadata():void{ $token = $this->provider->getTokenMetadata($this->token); diff --git a/tests/Providers/Unit/NPROneTest.php b/tests/Providers/Unit/NPROneTest.php index 87c1988e..3953ef1c 100644 --- a/tests/Providers/Unit/NPROneTest.php +++ b/tests/Providers/Unit/NPROneTest.php @@ -46,18 +46,6 @@ protected function getProviderFQCN():string{ return NPROne::class; } - public function testRequestInvalidAuthTypeException():void{ - $this->expectException(OAuthException::class); - $this->expectExceptionMessage('invalid auth type'); - - $this->setReflectionProperty('authMethod', -1); - - $token = new AccessToken(['accessToken' => 'test_access_token_secret', 'expires' => 1]); - $this->storage->storeAccessToken($token, $this->provider->serviceName); - - $this->provider->request('https://foo.api.npr.org/'); - } - public static function requestTargetProvider():array{ return [ 'empty' => ['', 'https://localhost/api'],