Поправлено поведение для проверки возможности обратного редиректа на сайты с его фиксированным значением

This commit is contained in:
ErickSkrauch 2016-03-20 17:39:09 +03:00
parent 951b6928a2
commit ddb5fd813c

View File

@ -7,45 +7,55 @@ use League\OAuth2\Server\Entity\ClientEntity;
use League\OAuth2\Server\Entity\SessionEntity as OriginalSessionEntity; use League\OAuth2\Server\Entity\SessionEntity as OriginalSessionEntity;
use League\OAuth2\Server\Storage\AbstractStorage; use League\OAuth2\Server\Storage\AbstractStorage;
use League\OAuth2\Server\Storage\ClientInterface; use League\OAuth2\Server\Storage\ClientInterface;
use yii\helpers\StringHelper;
class ClientStorage extends AbstractStorage implements ClientInterface { class ClientStorage extends AbstractStorage implements ClientInterface {
const REDIRECT_STATIC_PAGE = 'static_page';
const REDIRECT_STATIC_PAGE_WITH_CODE = 'static_page_with_code';
/** /**
* @inheritdoc * @inheritdoc
*/ */
public function get($clientId, $clientSecret = null, $redirectUri = null, $grantType = null) { public function get($clientId, $clientSecret = null, $redirectUri = null, $grantType = null) {
$query = OauthClient::find() $query = OauthClient::find()
->select(['id', 'name', 'secret']) ->select(['id', 'name', 'secret', 'redirect_uri'])
->where([OauthClient::tableName() . '.id' => $clientId]); ->where([OauthClient::tableName() . '.id' => $clientId]);
if ($clientSecret !== null) { if ($clientSecret !== null) {
$query->andWhere(['secret' => $clientSecret]); $query->andWhere(['secret' => $clientSecret]);
} }
if ($redirectUri !== null) {
$query
->addSelect(['redirect_uri'])
->andWhere(['redirect_uri' => $redirectUri]);
}
$model = $query->asArray()->one(); $model = $query->asArray()->one();
if ($model === null) { if ($model === null) {
return null; return null;
} }
// TODO: нужно учитывать тип приложения
/*
* Для приложений типа "настольный" redirect_uri необязателем - он должен быть по умолчанию равен
* статичному редиректу на страницу сайта
* А для приложений типа "сайт" редирект должен быть всегда.
* Короче это нужно учесть
*/
if ($redirectUri !== null) {
if ($redirectUri === self::REDIRECT_STATIC_PAGE || $redirectUri === self::REDIRECT_STATIC_PAGE_WITH_CODE) {
// Тут, наверное, нужно проверить тип приложения
} else {
if (!StringHelper::startsWith($redirectUri, $model['redirect_uri'], false)) {
return null;
}
}
}
$entity = new ClientEntity($this->server); $entity = new ClientEntity($this->server);
$entity->hydrate([ $entity->hydrate([
'id' => $model['id'], 'id' => $model['id'],
'name' => $model['name'], 'name' => $model['name'],
'secret' => $model['secret'], 'secret' => $model['secret'],
'redirectUri' => $redirectUri,
]); ]);
if (isset($model['redirect_uri'])) {
$entity->hydrate([
'redirectUri' => $model['redirect_uri'],
]);
}
return $entity; return $entity;
} }