263 lines
5.4 KiB
PHP
263 lines
5.4 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of jwt-auth.
|
|
*
|
|
* (c) Sean Tymon <tymon148@gmail.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Tymon\JWTAuth;
|
|
|
|
use Tymon\JWTAuth\Claims\Claim;
|
|
use Tymon\JWTAuth\Claims\Collection;
|
|
use Tymon\JWTAuth\Support\RefreshFlow;
|
|
use Tymon\JWTAuth\Support\CustomClaims;
|
|
use Tymon\JWTAuth\Validators\PayloadValidator;
|
|
use Tymon\JWTAuth\Claims\Factory as ClaimFactory;
|
|
|
|
class Factory
|
|
{
|
|
use CustomClaims, RefreshFlow;
|
|
|
|
/**
|
|
* The claim factory.
|
|
*
|
|
* @var \Tymon\JWTAuth\Claims\Factory
|
|
*/
|
|
protected $claimFactory;
|
|
|
|
/**
|
|
* The validator.
|
|
*
|
|
* @var \Tymon\JWTAuth\Validators\PayloadValidator
|
|
*/
|
|
protected $validator;
|
|
|
|
/**
|
|
* The default claims.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $defaultClaims = [
|
|
'iss',
|
|
'iat',
|
|
'exp',
|
|
'nbf',
|
|
'jti',
|
|
];
|
|
|
|
/**
|
|
* The claims collection.
|
|
*
|
|
* @var \Tymon\JWTAuth\Claims\Collection
|
|
*/
|
|
protected $claims;
|
|
|
|
/**
|
|
* Constructor.
|
|
*
|
|
* @param \Tymon\JWTAuth\Claims\Factory $claimFactory
|
|
* @param \Tymon\JWTAuth\Validators\PayloadValidator $validator
|
|
*
|
|
* @return void
|
|
*/
|
|
public function __construct(ClaimFactory $claimFactory, PayloadValidator $validator)
|
|
{
|
|
$this->claimFactory = $claimFactory;
|
|
$this->validator = $validator;
|
|
$this->claims = new Collection;
|
|
}
|
|
|
|
/**
|
|
* Create the Payload instance.
|
|
*
|
|
* @param bool $resetClaims
|
|
*
|
|
* @return \Tymon\JWTAuth\Payload
|
|
*/
|
|
public function make($resetClaims = false)
|
|
{
|
|
if ($resetClaims) {
|
|
$this->emptyClaims();
|
|
}
|
|
|
|
$payload = $this->withClaims($this->buildClaimsCollection());
|
|
|
|
return $payload;
|
|
}
|
|
|
|
/**
|
|
* Empty the claims collection.
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function emptyClaims()
|
|
{
|
|
$this->claims = new Collection;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Add an array of claims to the Payload.
|
|
*
|
|
* @param array $claims
|
|
*
|
|
* @return $this
|
|
*/
|
|
protected function addClaims(array $claims)
|
|
{
|
|
foreach ($claims as $name => $value) {
|
|
$this->addClaim($name, $value);
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Add a claim to the Payload.
|
|
*
|
|
* @param string $name
|
|
* @param mixed $value
|
|
*
|
|
* @return $this
|
|
*/
|
|
protected function addClaim($name, $value)
|
|
{
|
|
$this->claims->put($name, $value);
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Build the default claims.
|
|
*
|
|
* @return $this
|
|
*/
|
|
protected function buildClaims()
|
|
{
|
|
// remove the exp claim if it exists and the ttl is null
|
|
if ($this->claimFactory->getTTL() === null && $key = array_search('exp', $this->defaultClaims)) {
|
|
unset($this->defaultClaims[$key]);
|
|
}
|
|
|
|
// add the default claims
|
|
foreach ($this->defaultClaims as $claim) {
|
|
$this->addClaim($claim, $this->claimFactory->make($claim));
|
|
}
|
|
|
|
// add custom claims on top, allowing them to overwrite defaults
|
|
return $this->addClaims($this->getCustomClaims());
|
|
}
|
|
|
|
/**
|
|
* Build out the Claim DTO's.
|
|
*
|
|
* @return \Tymon\JWTAuth\Claims\Collection
|
|
*/
|
|
protected function resolveClaims()
|
|
{
|
|
return $this->claims->map(function ($value, $name) {
|
|
return $value instanceof Claim ? $value : $this->claimFactory->get($name, $value);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Build and get the Claims Collection.
|
|
*
|
|
* @return \Tymon\JWTAuth\Claims\Collection
|
|
*/
|
|
public function buildClaimsCollection()
|
|
{
|
|
return $this->buildClaims()->resolveClaims();
|
|
}
|
|
|
|
/**
|
|
* Get a Payload instance with a claims collection.
|
|
*
|
|
* @param \Tymon\JWTAuth\Claims\Collection $claims
|
|
*
|
|
* @return \Tymon\JWTAuth\Payload
|
|
*/
|
|
public function withClaims(Collection $claims)
|
|
{
|
|
return new Payload($claims, $this->validator, $this->refreshFlow);
|
|
}
|
|
|
|
/**
|
|
* Set the default claims to be added to the Payload.
|
|
*
|
|
* @param array $claims
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setDefaultClaims(array $claims)
|
|
{
|
|
$this->defaultClaims = $claims;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Helper to set the ttl.
|
|
*
|
|
* @param int $ttl
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setTTL($ttl)
|
|
{
|
|
$this->claimFactory->setTTL($ttl);
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Helper to get the ttl.
|
|
*
|
|
* @return int
|
|
*/
|
|
public function getTTL()
|
|
{
|
|
return $this->claimFactory->getTTL();
|
|
}
|
|
|
|
/**
|
|
* Get the default claims.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getDefaultClaims()
|
|
{
|
|
return $this->defaultClaims;
|
|
}
|
|
|
|
/**
|
|
* Get the PayloadValidator instance.
|
|
*
|
|
* @return \Tymon\JWTAuth\Validators\PayloadValidator
|
|
*/
|
|
public function validator()
|
|
{
|
|
return $this->validator;
|
|
}
|
|
|
|
/**
|
|
* Magically add a claim.
|
|
*
|
|
* @param string $method
|
|
* @param array $parameters
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function __call($method, $parameters)
|
|
{
|
|
$this->addClaim($method, $parameters[0]);
|
|
|
|
return $this;
|
|
}
|
|
}
|