2017-08-28 1 views
2

私は、ユーザーを認証するために、このコントローラーを使用してsymfonyプロジェクト継承しました:なぜ私のjwtトークンは期限切れにならないのですか?

class TokenController extends FOSRestController 
{ 
    public function postTokensAction(Request $request) 
    { 
     $username = $request->request->get('username'); 
     $password = $request->request->get('password'); 

     $user = $this->get('fos_user.user_manager') 
        ->findUserByUsername($username); 

     if (!$user) { 
      throw $this->createNotFoundException(); 
     } 

     $passwordEncoder = $this->get('security.password_encoder'); 
     if(!$passwordEncoder->isPasswordValid($user, $password)) { 
      throw $this->createAccessDeniedException(); 
     } 

     $groups = ['foo', 'bar']; 
     $context = SerializationContext::create() 
         ->setGroups($groups); 

     $token = $this->get('lexik_jwt_authentication.encoder') 
         ->encode(['username' => $user->getUsername()]); 

     $user = $this->get('jms_serializer') 
        ->toArray($user, $context); 

     return new JsonResponse([ 
      'token' => $token, 
      'user' => $user 
     ]); 
    } 
} 

を、顧客が更新を要求:トークンは、ログイン後に10秒を期限切れにする必要があります。したがって、ドキュメントに続いて、このリスナーを追加しました。

<?php 

namespace AppBundle\EventListener; 

use Lexik\Bundle\JWTAuthenticationBundle\Event\JWTCreatedEvent; 

class JWTCreatedListener 
{ 
    public function onJWTCreated(JWTCreatedEvent $event) 
    { 
     $expiration = new \DateTime('now'); 
     $expiration->add(new \DateInterval('PT10S')); 
     $payload = $event->getData(); 
     $payload['exp'] = $expiration->getTimestamp(); 
     $event->setData($payload); 
    } 
} 

そして、もちろん、私はイベントを監視するリスナーをマークした

acme_api.event.jwt_created_listener: 
    class: AppBundle\EventListener\JWTCreatedListener 
    tags: 
     - { name: kernel.event_listener, event: lexik_jwt_authentication.on_jwt_created, method: onJWTCreated } 

私はポストマンでトークンを取得し、次の要求を作成するためにそれを使用している場合は、私は日のために、これらの要求を行うことができますそして日々。トークンは期限切れになりません。私のJWTCreatedListenerは動作していないようです。

どういうところが間違っていますか?

+0

'lexik_jwt_authentication.on_jwt_created'イベントが要求ごとに、それぞれの時間をトリガーするか、ではありませんように見えます決して全く呼ばない。あなたはこの問題を解決しましたかhttps://stackoverflow.com/questions/45617269/the-lexik-jwt-authentication-on-jwt-created-is-not-present-in-symfonys-profil? – yceruto

答えて

1

JWTエンコーダである低レベルのAPIを使用しているため、期限切れになることはありません。あなたが見るから分かるように、encode()はペイロードを取ります。 トークンの有効期限を取得するには、有効期限のタイムスタンプ値を持つexpクレームがペイロードに含まれている必要があります。
これはlexik_jwt_authentication.encoder.token_ttl設定オプションの値を使用して有効期限を判断するサービスlexik_jwt_authentication.jwt_managerによって処理されます。それを設定し、$this->get('lexik_jwt_authentication.jwt_manager')->create($user)を使用してトークンを作成し、次に$this->get('lexik_jwt_authentication.jwt_manager')->decode($token)をデコード/検証します。

このバンドルを適切に使用する(提供するすべてのイベントにフックできるようにする)ためには、コントローラーで手動で行うのではなく、適切なセキュリティー構成(READMEを参照)を使用することを検討する必要があります。

1

鍵はここにある:

$token = $this->get('lexik_jwt_authentication.encoder') 
       ->encode(['username' => $user->getUsername()]); 

私は機能をエンコードするために別のパラメータを追加する必要があります。

$token = $this->get('lexik_jwt_authentication.encoder') 
       ->encode([ 
        'username' => $user->getUsername(), 
        'exp'  => (new \DateTime('+30 minute'))->getTimestamp(), 
       ]); 
関連する問題