Исправлен парсинг списка скоупов, если передан массив

Fixes ACCOUNTS-2NA
This commit is contained in:
ErickSkrauch 2017-10-04 14:42:48 +03:00
parent 839257e32a
commit 3143d2fc26
5 changed files with 37 additions and 10 deletions

View File

@ -27,7 +27,6 @@ class Component extends BaseComponent {
$authServer->setSessionStorage(new Storage\SessionStorage()); $authServer->setSessionStorage(new Storage\SessionStorage());
$authServer->setAuthCodeStorage(new Storage\AuthCodeStorage()); $authServer->setAuthCodeStorage(new Storage\AuthCodeStorage());
$authServer->setRefreshTokenStorage(new Storage\RefreshTokenStorage()); $authServer->setRefreshTokenStorage(new Storage\RefreshTokenStorage());
$authServer->setScopeDelimiter(',');
$authServer->setAccessTokenTTL(86400); // 1d $authServer->setAccessTokenTTL(86400); // 1d
$authServer->addGrantType(new Grants\AuthCodeGrant()); $authServer->addGrantType(new Grants\AuthCodeGrant());

View File

@ -7,6 +7,7 @@ use api\components\OAuth2\Entities\ClientEntity;
use api\components\OAuth2\Entities\RefreshTokenEntity; use api\components\OAuth2\Entities\RefreshTokenEntity;
use api\components\OAuth2\Entities\SessionEntity; use api\components\OAuth2\Entities\SessionEntity;
use api\components\OAuth2\Storage\ScopeStorage; use api\components\OAuth2\Storage\ScopeStorage;
use api\components\OAuth2\Utils\Scopes;
use League\OAuth2\Server\Entity\AuthCodeEntity as BaseAuthCodeEntity; use League\OAuth2\Server\Entity\AuthCodeEntity as BaseAuthCodeEntity;
use League\OAuth2\Server\Entity\ClientEntity as BaseClientEntity; use League\OAuth2\Server\Entity\ClientEntity as BaseClientEntity;
use League\OAuth2\Server\Event\ClientAuthenticationFailedEvent; use League\OAuth2\Server\Event\ClientAuthenticationFailedEvent;
@ -220,7 +221,7 @@ class AuthCodeGrant extends AbstractGrant {
/** /**
* По стандарту OAuth2 scopes должны разделяться пробелом, а не запятой. Косяк. * По стандарту OAuth2 scopes должны разделяться пробелом, а не запятой. Косяк.
* Так что оборачиваем функцию разбора скоупов, заменяя пробелы на запятые. * Так что оборачиваем функцию разбора скоупов, заменяя запятые на пробелы.
* *
* @param string $scopeParam * @param string $scopeParam
* @param BaseClientEntity $client * @param BaseClientEntity $client
@ -229,8 +230,7 @@ class AuthCodeGrant extends AbstractGrant {
* @return \League\OAuth2\Server\Entity\ScopeEntity[] * @return \League\OAuth2\Server\Entity\ScopeEntity[]
*/ */
public function validateScopes($scopeParam = '', BaseClientEntity $client, $redirectUri = null) { public function validateScopes($scopeParam = '', BaseClientEntity $client, $redirectUri = null) {
$scopes = str_replace(' ', $this->server->getScopeDelimiter(), $scopeParam); return parent::validateScopes(Scopes::format($scopeParam), $client, $redirectUri);
return parent::validateScopes($scopes, $client, $redirectUri);
} }
} }

View File

@ -3,6 +3,7 @@ namespace api\components\OAuth2\Grants;
use api\components\OAuth2\Entities\AccessTokenEntity; use api\components\OAuth2\Entities\AccessTokenEntity;
use api\components\OAuth2\Entities\SessionEntity; use api\components\OAuth2\Entities\SessionEntity;
use api\components\OAuth2\Utils\Scopes;
use League\OAuth2\Server\Entity\ClientEntity as BaseClientEntity; use League\OAuth2\Server\Entity\ClientEntity as BaseClientEntity;
use League\OAuth2\Server\Event; use League\OAuth2\Server\Event;
use League\OAuth2\Server\Exception; use League\OAuth2\Server\Exception;
@ -69,7 +70,7 @@ class ClientCredentialsGrant extends AbstractGrant {
/** /**
* По стандарту OAuth2 scopes должны разделяться пробелом, а не запятой. Косяк. * По стандарту OAuth2 scopes должны разделяться пробелом, а не запятой. Косяк.
* Так что оборачиваем функцию разбора скоупов, заменяя пробелы на запятые. * Так что оборачиваем функцию разбора скоупов, заменяя запятые на пробелы.
* *
* @param string $scopeParam * @param string $scopeParam
* @param BaseClientEntity $client * @param BaseClientEntity $client
@ -78,8 +79,7 @@ class ClientCredentialsGrant extends AbstractGrant {
* @return \League\OAuth2\Server\Entity\ScopeEntity[] * @return \League\OAuth2\Server\Entity\ScopeEntity[]
*/ */
public function validateScopes($scopeParam = '', BaseClientEntity $client, $redirectUri = null) { public function validateScopes($scopeParam = '', BaseClientEntity $client, $redirectUri = null) {
$scopes = str_replace(' ', $this->server->getScopeDelimiter(), $scopeParam); return parent::validateScopes(Scopes::format($scopeParam), $client, $redirectUri);
return parent::validateScopes($scopes, $client, $redirectUri);
} }
} }

View File

@ -3,6 +3,7 @@ namespace api\components\OAuth2\Grants;
use api\components\OAuth2\Entities\AccessTokenEntity; use api\components\OAuth2\Entities\AccessTokenEntity;
use api\components\OAuth2\Entities\RefreshTokenEntity; use api\components\OAuth2\Entities\RefreshTokenEntity;
use api\components\OAuth2\Utils\Scopes;
use ErrorException; use ErrorException;
use League\OAuth2\Server\Entity\AccessTokenEntity as BaseAccessTokenEntity; use League\OAuth2\Server\Entity\AccessTokenEntity as BaseAccessTokenEntity;
use League\OAuth2\Server\Entity\ClientEntity as BaseClientEntity; use League\OAuth2\Server\Entity\ClientEntity as BaseClientEntity;
@ -48,7 +49,7 @@ class RefreshTokenGrant extends AbstractGrant {
/** /**
* По стандарту OAuth2 scopes должны разделяться пробелом, а не запятой. Косяк. * По стандарту OAuth2 scopes должны разделяться пробелом, а не запятой. Косяк.
* Так что оборачиваем функцию разбора скоупов, заменяя пробелы на запятые. * Так что оборачиваем функцию разбора скоупов, заменяя запятые на пробелы.
* *
* @param string $scopeParam * @param string $scopeParam
* @param BaseClientEntity $client * @param BaseClientEntity $client
@ -57,8 +58,7 @@ class RefreshTokenGrant extends AbstractGrant {
* @return \League\OAuth2\Server\Entity\ScopeEntity[] * @return \League\OAuth2\Server\Entity\ScopeEntity[]
*/ */
public function validateScopes($scopeParam = '', BaseClientEntity $client, $redirectUri = null) { public function validateScopes($scopeParam = '', BaseClientEntity $client, $redirectUri = null) {
$scopes = str_replace(' ', $this->server->getScopeDelimiter(), $scopeParam); return parent::validateScopes(Scopes::format($scopeParam), $client, $redirectUri);
return parent::validateScopes($scopes, $client, $redirectUri);
} }
/** /**

View File

@ -0,0 +1,28 @@
<?php
namespace api\components\OAuth2\Utils;
class Scopes {
/**
* По стандарту OAuth2 scopes должны разделяться пробелом, а не запятой. Косяк.
* Так что оборачиваем функцию разбора скоупов, заменяя запятые на пробелы.
* Заодно учитываем возможность передать скоупы в виде массива.
*
* @param string|array $scopes
*
* @return string
*/
public static function format($scopes): string {
if ($scopes === null) {
return '';
}
if (is_array($scopes)) {
return implode(' ', $scopes);
}
/** @noinspection PhpIncompatibleReturnTypeInspection */
return str_replace(',', ' ', $scopes);
}
}