2017-06-26 11 views
0

opentok rest APIに対するREST要求を実行するとき、私のjwtトークンが "期限切れ"になっています。OpenTok JWT Authenticacion Bug

ちょっと考えてみると、私はサーバの日付を取得するためだけにサーバにダミーのリクエストを行いました。トークンの有効期限と同じ日付を使ってセッションに属するビデオをリストできました。

これは明らかに間違っています.iat時間とexp時間はサーバの日付と一致してはいけません。

考えられる解決策:

A)ユーザがサーバのタイムゾーンと特定のプロジェクトのために設定されたタイムゾーンに関するこれらの日付と一致する必要がありOpenTok RESTサーバーを指定することができるはずです。

B)iatを無視し、有効期限を秒単位で検討してください。

おかげ

答えて

0

パッチ

/** 
* 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

これは、サーバー上の時計が正しく同期されていないことを示しています。バージョン2.5.0以降のPHP SDKはJWTを実装しており、正しく動作することが証明されています。 v2.5.0にアップグレードし、サーバーの時計が正確であることを確認することをお勧めします。