123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- <?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 BadMethodCallException;
- use Lcobucci\JWT\Claim\Factory as ClaimFactory;
- use Lcobucci\JWT\Parsing\Encoder;
- /**
- * This class makes easier the token creation process
- *
- * @author Luís Otávio Cobucci Oblonczyk <lcobucci@gmail.com>
- * @since 0.1.0
- */
- class Builder
- {
- /**
- * The token header
- *
- * @var array
- */
- private $headers;
- /**
- * The token claim set
- *
- * @var array
- */
- private $claims;
- /**
- * The token signature
- *
- * @var Signature
- */
- private $signature;
- /**
- * The data encoder
- *
- * @var Encoder
- */
- private $encoder;
- /**
- * The factory of claims
- *
- * @var ClaimFactory
- */
- private $claimFactory;
- /**
- * Initializes a new builder
- *
- * @param Encoder $encoder
- * @param ClaimFactory $claimFactory
- */
- public function __construct(
- Encoder $encoder = null,
- ClaimFactory $claimFactory = null
- ) {
- $this->encoder = $encoder ?: new Encoder();
- $this->claimFactory = $claimFactory ?: new ClaimFactory();
- $this->headers = ['typ'=> 'JWT', 'alg' => 'none'];
- $this->claims = [];
- }
- /**
- * Configures the audience
- *
- * @param string $audience
- * @param boolean $replicateAsHeader
- *
- * @return Builder
- */
- public function setAudience($audience, $replicateAsHeader = false)
- {
- return $this->setRegisteredClaim('aud', (string) $audience, $replicateAsHeader);
- }
- /**
- * Configures the expiration time
- *
- * @param int $expiration
- * @param boolean $replicateAsHeader
- *
- * @return Builder
- */
- public function setExpiration($expiration, $replicateAsHeader = false)
- {
- return $this->setRegisteredClaim('exp', (int) $expiration, $replicateAsHeader);
- }
- /**
- * Configures the token id
- *
- * @param string $id
- * @param boolean $replicateAsHeader
- *
- * @return Builder
- */
- public function setId($id, $replicateAsHeader = false)
- {
- return $this->setRegisteredClaim('jti', (string) $id, $replicateAsHeader);
- }
- /**
- * Configures the time that the token was issued
- *
- * @param int $issuedAt
- * @param boolean $replicateAsHeader
- *
- * @return Builder
- */
- public function setIssuedAt($issuedAt, $replicateAsHeader = false)
- {
- return $this->setRegisteredClaim('iat', (int) $issuedAt, $replicateAsHeader);
- }
- /**
- * Configures the issuer
- *
- * @param string $issuer
- * @param boolean $replicateAsHeader
- *
- * @return Builder
- */
- public function setIssuer($issuer, $replicateAsHeader = false)
- {
- return $this->setRegisteredClaim('iss', (string) $issuer, $replicateAsHeader);
- }
- /**
- * Configures the time before which the token cannot be accepted
- *
- * @param int $notBefore
- * @param boolean $replicateAsHeader
- *
- * @return Builder
- */
- public function setNotBefore($notBefore, $replicateAsHeader = false)
- {
- return $this->setRegisteredClaim('nbf', (int) $notBefore, $replicateAsHeader);
- }
- /**
- * Configures the subject
- *
- * @param string $subject
- * @param boolean $replicateAsHeader
- *
- * @return Builder
- */
- public function setSubject($subject, $replicateAsHeader = false)
- {
- return $this->setRegisteredClaim('sub', (string) $subject, $replicateAsHeader);
- }
- /**
- * Configures a registed claim
- *
- * @param string $name
- * @param mixed $value
- * @param boolean $replicate
- *
- * @return Builder
- */
- protected function setRegisteredClaim($name, $value, $replicate)
- {
- $this->set($name, $value);
- if ($replicate) {
- $this->headers[$name] = $this->claims[$name];
- }
- return $this;
- }
- /**
- * Configures a header item
- *
- * @param string $name
- * @param mixed $value
- *
- * @return Builder
- *
- * @throws BadMethodCallException When data has been already signed
- */
- public function setHeader($name, $value)
- {
- if ($this->signature) {
- throw new BadMethodCallException('You must unsign before make changes');
- }
- $this->headers[(string) $name] = $this->claimFactory->create($name, $value);
- return $this;
- }
- /**
- * Configures a claim item
- *
- * @param string $name
- * @param mixed $value
- *
- * @return Builder
- *
- * @throws BadMethodCallException When data has been already signed
- */
- public function set($name, $value)
- {
- if ($this->signature) {
- throw new BadMethodCallException('You must unsign before making changes');
- }
- $this->claims[(string) $name] = $this->claimFactory->create($name, $value);
- return $this;
- }
- /**
- * Signs the data
- *
- * @param Signer $signer
- * @param string $key
- *
- * @return Builder
- */
- public function sign(Signer $signer, $key)
- {
- $signer->modifyHeader($this->headers);
- $this->signature = $signer->sign(
- $this->getToken()->getPayload(),
- $key
- );
- return $this;
- }
- /**
- * Removes the signature from the builder
- *
- * @return Builder
- */
- public function unsign()
- {
- $this->signature = null;
- return $this;
- }
- /**
- * Returns the resultant token
- *
- * @return Token
- */
- public function getToken()
- {
- $payload = [
- $this->encoder->base64UrlEncode($this->encoder->jsonEncode($this->headers)),
- $this->encoder->base64UrlEncode($this->encoder->jsonEncode($this->claims))
- ];
- if ($this->signature !== null) {
- $payload[] = $this->encoder->base64UrlEncode($this->signature);
- }
- return new Token($this->headers, $this->claims, $this->signature, $payload);
- }
- }
|