574 lines
15 KiB
PHP
Executable File
574 lines
15 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* This file is part of Lcobucci\JWT, a simple library to handle JWT and JWS
|
|
*
|
|
* @license http://opensource.org/licenses/BSD-3-Clause BSD-3-Clause
|
|
*/
|
|
|
|
namespace Lcobucci\JWT;
|
|
|
|
use DateInterval;
|
|
use DateTime;
|
|
use Lcobucci\JWT\Claim\Basic;
|
|
use Lcobucci\JWT\Claim\EqualsTo;
|
|
use Lcobucci\JWT\Claim\GreaterOrEqualsTo;
|
|
use Lcobucci\JWT\Claim\LesserOrEqualsTo;
|
|
|
|
/**
|
|
* @author Luís Otávio Cobucci Oblonczyk <lcobucci@gmail.com>
|
|
* @since 0.1.0
|
|
*/
|
|
class TokenTest extends \PHPUnit\Framework\TestCase
|
|
{
|
|
/**
|
|
* @test
|
|
*
|
|
* @covers Lcobucci\JWT\Token::__construct
|
|
*/
|
|
public function constructMustInitializeAnEmptyPlainTextTokenWhenNoArgumentsArePassed()
|
|
{
|
|
$token = new Token();
|
|
|
|
$this->assertAttributeEquals(['alg' => 'none'], 'headers', $token);
|
|
$this->assertAttributeEquals([], 'claims', $token);
|
|
$this->assertAttributeEquals(null, 'signature', $token);
|
|
$this->assertAttributeEquals(['', ''], 'payload', $token);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
*
|
|
* @covers Lcobucci\JWT\Token::hasHeader
|
|
*/
|
|
public function hasHeaderMustReturnTrueWhenItIsConfigured()
|
|
{
|
|
$token = new Token(['test' => 'testing']);
|
|
|
|
$this->assertTrue($token->hasHeader('test'));
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
*
|
|
* @covers Lcobucci\JWT\Token::hasHeader
|
|
*/
|
|
public function hasHeaderMustReturnFalseWhenItIsNotConfigured()
|
|
{
|
|
$token = new Token(['test' => 'testing']);
|
|
|
|
$this->assertFalse($token->hasHeader('testing'));
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
* @uses Lcobucci\JWT\Token::hasHeader
|
|
*
|
|
* @covers Lcobucci\JWT\Token::getHeader
|
|
*
|
|
* @expectedException \OutOfBoundsException
|
|
*/
|
|
public function getHeaderMustRaiseExceptionWhenHeaderIsNotConfigured()
|
|
{
|
|
$token = new Token(['test' => 'testing']);
|
|
|
|
$token->getHeader('testing');
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
* @uses Lcobucci\JWT\Token::hasHeader
|
|
*
|
|
* @covers Lcobucci\JWT\Token::getHeader
|
|
*/
|
|
public function getHeaderMustReturnTheDefaultValueWhenIsNotConfigured()
|
|
{
|
|
$token = new Token(['test' => 'testing']);
|
|
|
|
$this->assertEquals('blah', $token->getHeader('testing', 'blah'));
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
* @uses Lcobucci\JWT\Token::hasHeader
|
|
*
|
|
* @covers Lcobucci\JWT\Token::getHeader
|
|
* @covers Lcobucci\JWT\Token::getHeaderValue
|
|
*/
|
|
public function getHeaderMustReturnTheRequestedHeader()
|
|
{
|
|
$token = new Token(['test' => 'testing']);
|
|
|
|
$this->assertEquals('testing', $token->getHeader('test'));
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
* @uses Lcobucci\JWT\Token::hasHeader
|
|
* @uses Lcobucci\JWT\Claim\Basic
|
|
*
|
|
* @covers Lcobucci\JWT\Token::getHeader
|
|
* @covers Lcobucci\JWT\Token::getHeaderValue
|
|
*/
|
|
public function getHeaderMustReturnValueWhenItIsAReplicatedClaim()
|
|
{
|
|
$token = new Token(['jti' => new EqualsTo('jti', 1)]);
|
|
|
|
$this->assertEquals(1, $token->getHeader('jti'));
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
*
|
|
* @covers Lcobucci\JWT\Token::getHeaders
|
|
*/
|
|
public function getHeadersMustReturnTheConfiguredHeader()
|
|
{
|
|
$token = new Token(['test' => 'testing']);
|
|
|
|
$this->assertEquals(['test' => 'testing'], $token->getHeaders());
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
*
|
|
* @covers Lcobucci\JWT\Token::getClaims
|
|
*/
|
|
public function getClaimsMustReturnTheConfiguredClaims()
|
|
{
|
|
$token = new Token([], ['test' => 'testing']);
|
|
|
|
$this->assertEquals(['test' => 'testing'], $token->getClaims());
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
* @uses Lcobucci\JWT\Claim\Basic
|
|
*
|
|
* @covers Lcobucci\JWT\Token::hasClaim
|
|
*/
|
|
public function hasClaimMustReturnTrueWhenItIsConfigured()
|
|
{
|
|
$token = new Token([], ['test' => new Basic('test', 'testing')]);
|
|
|
|
$this->assertTrue($token->hasClaim('test'));
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
* @uses Lcobucci\JWT\Claim\Basic
|
|
*
|
|
* @covers Lcobucci\JWT\Token::hasClaim
|
|
*/
|
|
public function hasClaimMustReturnFalseWhenItIsNotConfigured()
|
|
{
|
|
$token = new Token([], ['test' => new Basic('test', 'testing')]);
|
|
|
|
$this->assertFalse($token->hasClaim('testing'));
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
* @uses Lcobucci\JWT\Token::hasClaim
|
|
* @uses Lcobucci\JWT\Claim\Basic
|
|
*
|
|
* @covers Lcobucci\JWT\Token::getClaim
|
|
*/
|
|
public function getClaimMustReturnTheDefaultValueWhenIsNotConfigured()
|
|
{
|
|
$token = new Token([], ['test' => new Basic('test', 'testing')]);
|
|
|
|
$this->assertEquals('blah', $token->getClaim('testing', 'blah'));
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
* @uses Lcobucci\JWT\Token::hasClaim
|
|
* @uses Lcobucci\JWT\Claim\Basic
|
|
*
|
|
* @covers Lcobucci\JWT\Token::getClaim
|
|
*
|
|
* @expectedException \OutOfBoundsException
|
|
*/
|
|
public function getClaimShouldRaiseExceptionWhenClaimIsNotConfigured()
|
|
{
|
|
$token = new Token();
|
|
$token->getClaim('testing');
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
* @uses Lcobucci\JWT\Token::hasClaim
|
|
* @uses Lcobucci\JWT\Claim\Basic
|
|
*
|
|
* @covers Lcobucci\JWT\Token::getClaim
|
|
*/
|
|
public function getClaimShouldReturnTheClaimValueWhenItExists()
|
|
{
|
|
$token = new Token([], ['testing' => new Basic('testing', 'test')]);
|
|
|
|
$this->assertEquals('test', $token->getClaim('testing'));
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
*
|
|
* @covers Lcobucci\JWT\Token::verify
|
|
*
|
|
* @expectedException BadMethodCallException
|
|
*/
|
|
public function verifyMustRaiseExceptionWhenTokenIsUnsigned()
|
|
{
|
|
$signer = $this->createMock(Signer::class);
|
|
|
|
$token = new Token();
|
|
$token->verify($signer, 'test');
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
*
|
|
* @covers Lcobucci\JWT\Token::verify
|
|
* @covers Lcobucci\JWT\Token::getPayload
|
|
*/
|
|
public function verifyShouldReturnFalseWhenTokenAlgorithmIsDifferent()
|
|
{
|
|
$signer = $this->createMock(Signer::class);
|
|
$signature = $this->createMock(Signature::class, [], [], '', false);
|
|
|
|
$signer->expects($this->any())
|
|
->method('getAlgorithmId')
|
|
->willReturn('HS256');
|
|
|
|
$signature->expects($this->never())
|
|
->method('verify');
|
|
|
|
$token = new Token(['alg' => 'RS256'], [], $signature);
|
|
|
|
$this->assertFalse($token->verify($signer, 'test'));
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
*
|
|
* @covers Lcobucci\JWT\Token::verify
|
|
* @covers Lcobucci\JWT\Token::getPayload
|
|
*/
|
|
public function verifyMustDelegateTheValidationToSignature()
|
|
{
|
|
$signer = $this->createMock(Signer::class);
|
|
$signature = $this->createMock(Signature::class, [], [], '', false);
|
|
|
|
$signer->expects($this->any())
|
|
->method('getAlgorithmId')
|
|
->willReturn('HS256');
|
|
|
|
$signature->expects($this->once())
|
|
->method('verify')
|
|
->with($signer, $this->isType('string'), 'test')
|
|
->willReturn(true);
|
|
|
|
$token = new Token(['alg' => 'HS256'], [], $signature);
|
|
|
|
$this->assertTrue($token->verify($signer, 'test'));
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
* @uses Lcobucci\JWT\ValidationData::__construct
|
|
* @uses Lcobucci\JWT\ValidationData::setCurrentTime
|
|
*
|
|
* @covers Lcobucci\JWT\Token::validate
|
|
* @covers Lcobucci\JWT\Token::getValidatableClaims
|
|
*/
|
|
public function validateShouldReturnTrueWhenClaimsAreEmpty()
|
|
{
|
|
$token = new Token();
|
|
|
|
$this->assertTrue($token->validate(new ValidationData()));
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
* @uses Lcobucci\JWT\ValidationData::__construct
|
|
* @uses Lcobucci\JWT\ValidationData::setCurrentTime
|
|
* @uses Lcobucci\JWT\Claim\Basic::__construct
|
|
*
|
|
* @covers Lcobucci\JWT\Token::validate
|
|
* @covers Lcobucci\JWT\Token::getValidatableClaims
|
|
*/
|
|
public function validateShouldReturnTrueWhenThereAreNoValidatableClaims()
|
|
{
|
|
$token = new Token([], ['testing' => new Basic('testing', 'test')]);
|
|
|
|
$this->assertTrue($token->validate(new ValidationData()));
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
* @uses Lcobucci\JWT\ValidationData
|
|
* @uses Lcobucci\JWT\Claim\Basic
|
|
* @uses Lcobucci\JWT\Claim\EqualsTo
|
|
*
|
|
* @covers Lcobucci\JWT\Token::validate
|
|
* @covers Lcobucci\JWT\Token::getValidatableClaims
|
|
*/
|
|
public function validateShouldReturnFalseWhenThereIsAtLeastOneFailedValidatableClaim()
|
|
{
|
|
$token = new Token(
|
|
[],
|
|
[
|
|
'iss' => new EqualsTo('iss', 'test'),
|
|
'testing' => new Basic('testing', 'test')
|
|
]
|
|
);
|
|
|
|
$data = new ValidationData();
|
|
$data->setIssuer('test1');
|
|
|
|
$this->assertFalse($token->validate($data));
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
* @uses Lcobucci\JWT\ValidationData
|
|
* @uses Lcobucci\JWT\Claim\Basic
|
|
* @uses Lcobucci\JWT\Claim\EqualsTo
|
|
* @uses Lcobucci\JWT\Claim\LesserOrEqualsTo
|
|
* @uses Lcobucci\JWT\Claim\GreaterOrEqualsTo
|
|
*
|
|
* @covers Lcobucci\JWT\Token::validate
|
|
* @covers Lcobucci\JWT\Token::getValidatableClaims
|
|
*/
|
|
public function validateShouldReturnFalseWhenATimeBasedClaimFails()
|
|
{
|
|
$now = time();
|
|
|
|
$token = new Token(
|
|
[],
|
|
[
|
|
'iss' => new EqualsTo('iss', 'test'),
|
|
'iat' => new LesserOrEqualsTo('iat', $now),
|
|
'nbf' => new LesserOrEqualsTo('nbf', $now + 20),
|
|
'exp' => new GreaterOrEqualsTo('exp', $now + 500),
|
|
'testing' => new Basic('testing', 'test')
|
|
]
|
|
);
|
|
|
|
$data = new ValidationData($now + 10);
|
|
$data->setIssuer('test');
|
|
|
|
$this->assertFalse($token->validate($data));
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
* @uses Lcobucci\JWT\ValidationData
|
|
* @uses Lcobucci\JWT\Claim\Basic
|
|
* @uses Lcobucci\JWT\Claim\EqualsTo
|
|
* @uses Lcobucci\JWT\Claim\LesserOrEqualsTo
|
|
* @uses Lcobucci\JWT\Claim\GreaterOrEqualsTo
|
|
*
|
|
* @covers Lcobucci\JWT\Token::validate
|
|
* @covers Lcobucci\JWT\Token::getValidatableClaims
|
|
*/
|
|
public function validateShouldReturnTrueWhenThereAreNoFailedValidatableClaims()
|
|
{
|
|
$now = time();
|
|
|
|
$token = new Token(
|
|
[],
|
|
[
|
|
'iss' => new EqualsTo('iss', 'test'),
|
|
'iat' => new LesserOrEqualsTo('iat', $now),
|
|
'exp' => new GreaterOrEqualsTo('exp', $now + 500),
|
|
'testing' => new Basic('testing', 'test')
|
|
]
|
|
);
|
|
|
|
$data = new ValidationData($now + 10);
|
|
$data->setIssuer('test');
|
|
|
|
$this->assertTrue($token->validate($data));
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
* @uses Lcobucci\JWT\ValidationData
|
|
* @uses Lcobucci\JWT\Claim\Basic
|
|
* @uses Lcobucci\JWT\Claim\EqualsTo
|
|
* @uses Lcobucci\JWT\Claim\LesserOrEqualsTo
|
|
* @uses Lcobucci\JWT\Claim\GreaterOrEqualsTo
|
|
*
|
|
* @covers Lcobucci\JWT\Token::validate
|
|
* @covers Lcobucci\JWT\Token::getValidatableClaims
|
|
*/
|
|
public function validateShouldReturnTrueWhenLeewayMakesAllTimeBasedClaimsTrueAndOtherClaimsAreTrue()
|
|
{
|
|
$now = time();
|
|
|
|
$token = new Token(
|
|
[],
|
|
[
|
|
'iss' => new EqualsTo('iss', 'test'),
|
|
'iat' => new LesserOrEqualsTo('iat', $now),
|
|
'nbf' => new LesserOrEqualsTo('nbf', $now + 20),
|
|
'exp' => new GreaterOrEqualsTo('exp', $now + 500),
|
|
'testing' => new Basic('testing', 'test')
|
|
]
|
|
);
|
|
|
|
$data = new ValidationData($now + 10, 20);
|
|
$data->setIssuer('test');
|
|
|
|
$this->assertTrue($token->validate($data));
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @covers Lcobucci\JWT\Token::isExpired
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
* @uses Lcobucci\JWT\Token::getClaim
|
|
* @uses Lcobucci\JWT\Token::hasClaim
|
|
*/
|
|
public function isExpiredShouldReturnFalseWhenTokenDoesNotExpires()
|
|
{
|
|
$token = new Token(['alg' => 'none']);
|
|
|
|
$this->assertFalse($token->isExpired());
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @covers Lcobucci\JWT\Token::isExpired
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
* @uses Lcobucci\JWT\Token::getClaim
|
|
* @uses Lcobucci\JWT\Token::hasClaim
|
|
* @uses Lcobucci\JWT\Claim\Basic
|
|
* @uses Lcobucci\JWT\Claim\GreaterOrEqualsTo
|
|
*/
|
|
public function isExpiredShouldReturnFalseWhenTokenIsNotExpired()
|
|
{
|
|
$token = new Token(
|
|
['alg' => 'none'],
|
|
['exp' => new GreaterOrEqualsTo('exp', time() + 500)]
|
|
);
|
|
|
|
$this->assertFalse($token->isExpired());
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @covers Lcobucci\JWT\Token::isExpired
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
* @uses Lcobucci\JWT\Token::getClaim
|
|
* @uses Lcobucci\JWT\Token::hasClaim
|
|
* @uses Lcobucci\JWT\Claim\Basic
|
|
* @uses Lcobucci\JWT\Claim\GreaterOrEqualsTo
|
|
*/
|
|
public function isExpiredShouldReturnTrueAfterTokenExpires()
|
|
{
|
|
$token = new Token(
|
|
['alg' => 'none'],
|
|
['exp' => new GreaterOrEqualsTo('exp', time())]
|
|
);
|
|
|
|
$this->assertTrue($token->isExpired(new DateTime('+10 days')));
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
*
|
|
* @covers Lcobucci\JWT\Token::getPayload
|
|
*/
|
|
public function getPayloadShouldReturnAStringWithTheTwoEncodePartsThatGeneratedTheToken()
|
|
{
|
|
$token = new Token(['alg' => 'none'], [], null, ['test1', 'test2', 'test3']);
|
|
|
|
$this->assertEquals('test1.test2', $token->getPayload());
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
* @uses Lcobucci\JWT\Token::getPayload
|
|
*
|
|
* @covers Lcobucci\JWT\Token::__toString
|
|
*/
|
|
public function toStringMustReturnEncodedDataWithEmptySignature()
|
|
{
|
|
$token = new Token(['alg' => 'none'], [], null, ['test', 'test']);
|
|
|
|
$this->assertEquals('test.test.', (string) $token);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*
|
|
* @uses Lcobucci\JWT\Token::__construct
|
|
* @uses Lcobucci\JWT\Token::getPayload
|
|
*
|
|
* @covers Lcobucci\JWT\Token::__toString
|
|
*/
|
|
public function toStringMustReturnEncodedData()
|
|
{
|
|
$signature = $this->createMock(Signature::class, [], [], '', false);
|
|
|
|
$token = new Token(['alg' => 'none'], [], $signature, ['test', 'test', 'test']);
|
|
|
|
$this->assertEquals('test.test.test', (string) $token);
|
|
}
|
|
}
|