Токен, выписанный на сессию без запоминания должен истекать дольше времени

This commit is contained in:
ErickSkrauch 2016-07-17 19:54:33 +03:00
parent ae3c3b88de
commit e756dbacd6
3 changed files with 17 additions and 6 deletions

View File

@ -63,6 +63,9 @@ class Component extends YiiUserComponent {
$token->addClaim(new SessionIdClaim($session->id)); $token->addClaim(new SessionIdClaim($session->id));
} else { } else {
$session = null; $session = null;
// Если мы не сохраняем сессию, то токен должен жить подольше, чтобы
// не прогорала сессия во время работы с аккаунтом
$token->addClaim(new Claim\Expiration(time() + 60 * 60 * 24 * 7));
} }
$jwt = $this->serializeToken($token); $jwt = $this->serializeToken($token);

View File

@ -78,10 +78,7 @@ class LoginForm extends ApiForm {
$account->save(); $account->save();
} }
/** @var \api\components\User\Component $component */ return Yii::$app->user->login($account, $this->rememberMe);
$component = Yii::$app->user;
return $component->login($account, $this->rememberMe);
} }
protected function getAccountClassName() { protected function getAccountClassName() {

View File

@ -9,6 +9,7 @@ use Codeception\Specify;
use common\models\AccountSession; use common\models\AccountSession;
use Emarref\Jwt\Algorithm\AlgorithmInterface; use Emarref\Jwt\Algorithm\AlgorithmInterface;
use Emarref\Jwt\Claim\ClaimInterface; use Emarref\Jwt\Claim\ClaimInterface;
use Emarref\Jwt\Claim\Expiration;
use Emarref\Jwt\Token; use Emarref\Jwt\Token;
use tests\codeception\api\unit\DbTestCase; use tests\codeception\api\unit\DbTestCase;
use tests\codeception\common\_support\ProtectedCaller; use tests\codeception\common\_support\ProtectedCaller;
@ -50,8 +51,13 @@ class ComponentTest extends DbTestCase {
$result = $this->component->login($account, false); $result = $this->component->login($account, false);
expect($result)->isInstanceOf(LoginResult::class); expect($result)->isInstanceOf(LoginResult::class);
expect($result->getSession())->null(); expect($result->getSession())->null();
expect(is_string($result->getJwt()))->true();
expect($result->getIdentity())->equals($account); expect($result->getIdentity())->equals($account);
$jwt = $result->getJwt();
expect(is_string($jwt))->true();
$token = $this->component->parseToken($jwt);
$claim = $token->getPayload()->findClaimByName(Expiration::NAME);
// Токен выписывается на 7 дней, но мы проверим хотя бы на 2 суток
expect($claim->getValue())->greaterThan(time() + 60 * 60 * 24 * 2);
}); });
$this->specify('success get LoginResult object with session value if rememberMe is true', function() { $this->specify('success get LoginResult object with session value if rememberMe is true', function() {
@ -60,9 +66,14 @@ class ComponentTest extends DbTestCase {
$result = $this->component->login($account, true); $result = $this->component->login($account, true);
expect($result)->isInstanceOf(LoginResult::class); expect($result)->isInstanceOf(LoginResult::class);
expect($result->getSession())->isInstanceOf(AccountSession::class); expect($result->getSession())->isInstanceOf(AccountSession::class);
expect(is_string($result->getJwt()))->true();
expect($result->getIdentity())->equals($account); expect($result->getIdentity())->equals($account);
expect($result->getSession()->refresh())->true(); expect($result->getSession()->refresh())->true();
$jwt = $result->getJwt();
expect(is_string($jwt))->true();
$token = $this->component->parseToken($jwt);
$claim = $token->getPayload()->findClaimByName(Expiration::NAME);
// Токен выписывается на 1 час, т.к. в дальнейшем он будет рефрешиться
expect($claim->getValue())->lessOrEquals(time() + 3600);
}); });
} }