2017-06-26 3 views
0

Bei der Ausführung einer REST-Anfrage an die opentok Rest API bekam ich, dass mein JWT-Token "abgelaufen" war.OpenTok JWT Authenticacion Bug

Ich frage mich ein wenig, ich führte eine Dummy-Anfrage an den Server nur zum Abrufen des Server-Datum, mit dem gleichen Datum vom Server als die Token-Ablaufzeit konnte ich Videos zu einer Sitzung auflisten.

Dies ist eindeutig falsch, die IAT-Zeit und die Exp-Zeit sollte nicht mit dem Server-Datum übereinstimmen.

Mögliche Lösungen:

A) Der Benutzer sollte seine Server-Zeitzone angeben und den OpenTok REST-Server der Lage sein sollte konfiguriert für ein bestimmtes Projekt jene Daten in Bezug auf die Zeitzone anzupassen.

B) IAT ignorieren und die Verfallszeit in Sekunden betrachten.

Dank

Antwort

0

Patch-

/** 
* Useless class used to fix bugs and solve single session archive fetching 
* issue in opentok. 
* 
* This class also implements JWT in order to comply with the new authentication 
* system that will be in use during July of 2017. 
* 
* A problem was also detected when trying to authenticate (date issue) 
* 
* @see https://github.com/opentok/OpenTok-PHP-SDK/issues/172 
* @see https://stackoverflow.com/questions/44768499/opentok-jwt-authenticacion-bug 
* 
* @author Federico Stange <[email protected]> 
*/ 

namespace stange\opentok; 

use \Firebase\JWT\JWT; 
use \Guzzle\Common\Event; 
use \OpenTok\Util\Client as OpenTokClient; 

class OTAuthPlugin extends \OpenTok\Util\Plugin\PartnerAuth{ 

    private $timestamp = null; 

    public static function getSubscribedEvents(){ 
     return array('request.before_send' => 'onBeforeSend'); 
    } 

    public function setTimestamp($time){ 
     $this->timestamp =$time; 
     return $this; 
    } 

    public function getTimestamp(){ 
     return $this->timestamp; 
    } 

    public function onBeforeSend(Event $event){ 

     $event['request']->addHeader(
       'X-OPENTOK-AUTH', 
       $this->createAuthHeader() 
     ); 

    } 

    private function createAuthHeader(){ 

     $token = array(
      'ist' => 'project', 
      'iss' => $this->apiKey, 
      'iat' => $this->timestamp, 
      'exp' => $this->timestamp+180, 
      'jti' => uniqid() 
     ); 

     return JWT::encode($token, $this->apiSecret); 

    } 

} 

class Client extends OpenTokClient{ 

    public function configure($apiKey, $apiSecret, $apiUrl){ 
     $this->apiKey = $apiKey; 
     $this->apiSecret = $apiSecret; 
     $this->setBaseUrl($apiUrl); 
     $this->setUserAgent(OPENTOK_SDK_USER_AGENT, true); 

     $opentokAuthPlugin = new OTAuthPlugin($apiKey, $apiSecret); 
     $opentokAuthPlugin->setTimestamp($this->getServerDate()); 

     $this->addSubscriber($opentokAuthPlugin); 

     $this->configured = true; 
    } 

    /** 
    * Make a request for getting the server date 
    * this is a bug and it has been reported to the opentok team. 
    * and to the tech support department. 
    * 
    * 
    */ 

    public function getServerDate(){ 

     try{ 

      $response = $this->get(
       "/v2/project/". md5(uniqid()) 
      )->send(); 

     } catch (\Exception $e) { 

      $date = $e->getResponse()->getHeader('Date')->toArray(); 
      $date = $date[0]; 

      $serverDate = \DateTime::createFromFormat(
        "D, d M Y H:i:s e", 
        $date 
      ); 

      return $serverDate->getTimestamp(); 

     } 

     return $serverDate; 

    } 

    public function listArchivesInSession($sessionId){ 
     $url = "/v2/project/{$this->apiKey}/archive?sessionId=$sessionId"; 
     $request = $this->get($url); 
     return $request->send()->json(); 
    } 

} 
0

Dies ist ein Hinweis darauf, dass die Uhr auf Ihrem Server nicht korrekt synchronisiert. Das PHP SDK ab Version 2.5.0 hat JWT implementiert und funktioniert nachweislich korrekt. Ich empfehle Ihnen, auf Version 2.5.0 zu aktualisieren und sicherzustellen, dass Ihre Serveruhr genau ist.

Verwandte Themen