Advertisement
luanoliveira

Aplicativo

May 4th, 2018
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 5.79 KB | None | 0 0
  1. <?php
  2.  
  3. namespace Lojas\Model;
  4.  
  5. use Ramsey\Uuid\Uuid;
  6. use Lcobucci\JWT\Builder;
  7. use Lcobucci\JWT\Signer\Hmac\Sha256;
  8. use Lcobucci\JWT\Parser;
  9.  
  10. class Aplicativo extends Model
  11. {
  12.     protected $table = 'lojas_apps';
  13.    
  14.     public function init()
  15.     {
  16.         $this->text('nome', 'Nome do Aplicativo')->mandatory()->maxLength(255);
  17.         $this->text('app_key', 'App Key');
  18.         $this->text('app_secret', 'App Secret');
  19.         $this->timestamp('data_hora');
  20.     }
  21.  
  22.     protected function beforeSave($operation)
  23.     {
  24.         if ($operation!=self::OP_INSERT) {
  25.             return;
  26.         }
  27.  
  28.         $uuid4 = Uuid::uuid4();
  29.         $appKey = uniqid($this->loja_id, TRUE);
  30.         $this->app_key = $appKey;
  31.         $this->app_secret = sha1($uuid4->toString());
  32.     }
  33.  
  34.     protected static function createToken($appSecret, $expiresIn=null)
  35.     {
  36.         if (empty($expiresIn)) {
  37.             $expiresIn = strtotime("+30 minutes", time());
  38.         }
  39.  
  40.         $uuid4 = Uuid::uuid4();
  41.  
  42.         $signer = new Sha256();
  43.         $token = (new Builder())
  44.             ->setIssuer('http://paytour.com.br')
  45.             ->setId($uuid4->toString(), true)
  46.             ->setExpiration($expiresIn)
  47.             ->sign($signer, $appSecret)
  48.             ->getToken();
  49.  
  50.         return strval($token);
  51.     }
  52.  
  53.     public static function findByLoja($lojaId, $appKey, $appSecret)
  54.     {
  55.         $connection = self::getConnection();
  56.         $query = $connection->createQueryBuilder();
  57.         $query->select('la.*');
  58.         $query->from('lojas_apps', 'la');
  59.         $query->where('la.loja_id=:loja_id AND la.app_key=:app_key AND la.app_secret=:app_secret');
  60.         $query->setParameter('loja_id', $lojaId);
  61.         $query->setParameter('app_key', $appKey);
  62.         $query->setParameter('app_secret', $appSecret);
  63.         return $query->execute()->fetch();
  64.     }
  65.  
  66.     public static function createAccessToken($lojaId, $appKey, $appSecret, &$expiresIn=null)
  67.     {
  68.         $app = static::findByLoja($lojaId, $appKey, $appSecret);
  69.  
  70.         if (empty($app)) {
  71.             return false;
  72.         }
  73.  
  74.         $date = new \DateTime;
  75.         $date->modify('+30 minutes');
  76.         $expiresIn = $date->getTimestamp();
  77.                
  78.         $accessToken = static::createToken($appSecret, $expiresIn);
  79.        
  80.         $connection = self::getConnection();
  81.         $query = $connection->createQueryBuilder();
  82.         $query
  83.             ->insert('lojas_apps_access_tokens')
  84.             ->values([
  85.                 'loja_app_id' => $app['id'],
  86.                 'access_token' => $query->createNamedParameter($accessToken),
  87.                 'data_expiracao' => $query->createNamedParameter(date('Y-m-d H:i:s', $expiresIn))
  88.             ]);
  89.        
  90.         if (!$query->execute()) {
  91.             return false;            
  92.         }
  93.            
  94.         return $accessToken;
  95.     }
  96.  
  97.     public static function createRefreshToken($lojaId, $appKey, $appSecret, &$expiresIn=null)
  98.     {
  99.         $app = static::findByLoja($lojaId, $appKey, $appSecret);
  100.  
  101.         if (empty($app)) {
  102.             return false;
  103.         }
  104.  
  105.         $date = new \DateTime;
  106.         $date->modify('+15 days');
  107.         $expiresIn = $date->getTimestamp();
  108.                
  109.         $refreshToken = static::createToken($appSecret, $expiresIn);
  110.        
  111.         $connection = self::getConnection();
  112.         $query = $connection->createQueryBuilder();
  113.         $query
  114.             ->insert('lojas_apps_refresh_tokens')
  115.             ->values([
  116.                 'loja_app_id' => $app['id'],
  117.                 'refresh_token' => $query->createNamedParameter($refreshToken),
  118.                 'data_expiracao' => $query->createNamedParameter(date('Y-m-d H:i:s', $expiresIn))
  119.             ]);
  120.        
  121.         if (!$query->execute()) {
  122.             return false;            
  123.         }
  124.            
  125.         return $refreshToken;
  126.     }
  127.  
  128.     public static function isValidAccessToken($accessToken, $lojaId, $appSecret)
  129.     {
  130.         $connection = self::getConnection();
  131.         $query = $connection->createQueryBuilder();
  132.         $query->select('laat.*');
  133.         $query->from('lojas_apps_access_tokens', 'laat');
  134.         $query->where('laat.access_token=:access_token AND laat.data_expiracao >= CURRENT_TIMESTAMP()');
  135.         $query->join('laat', 'lojas_apps', 'la', 'la.id=laat.loja_app_id AND la.loja_id=:loja_id');
  136.         $query->setParameter('access_token', $accessToken);
  137.         $query->setParameter('loja_id', $lojaId);
  138.         $token = $query->execute()->fetch();
  139.  
  140.         if (empty($token)) {
  141.             return false;
  142.         }
  143.  
  144.         try {
  145.             $signer = new Sha256();
  146.             $jwt = (new Parser())->parse($token['access_token']);
  147.             return $jwt->verify($signer, $appSecret);
  148.         } catch (\Exception $ex) {
  149.             return false;
  150.         }        
  151.     }
  152.  
  153.     public static function isValidRefreshToken($refreshToken, $lojaId, $appSecret)
  154.     {
  155.         $connection = self::getConnection();
  156.         $query = $connection->createQueryBuilder();
  157.         $query->select('lart.*');
  158.         $query->from('lojas_apps_refresh_tokens', 'lart');
  159.         $query->where('lart.refresh_token=:refresh_token AND lart.data_expiracao >= CURRENT_TIMESTAMP()');
  160.         $query->join('lart', 'lojas_apps', 'la', 'la.id=lart.loja_app_id AND la.loja_id=:loja_id');
  161.         $query->setParameter('refresh_token', $refreshToken);
  162.         $query->setParameter('loja_id', $lojaId);
  163.         $token = $query->execute()->fetch();
  164.  
  165.         if (empty($token)) {
  166.             return false;
  167.         }
  168.  
  169.         try {
  170.             $signer = new Sha256();
  171.             $jwt = (new Parser())->parse($token['refresh_token']);
  172.             return $jwt->verify($signer, $appSecret);
  173.         } catch (\Exception $ex) {
  174.             return false;
  175.         }
  176.     }
  177. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement