2016-12-21 4 views
2

J'essaie d'utiliser LexikJWTAuthBundle avec FOSRestBundle pour sécuriser mes routes API. Cela fonctionne bien quand je donne manuellement le JWT dans l'en-tête de mes demandes, mais pour mon application je voudrais l'ajouter automatiquement dans l'en-tête de chaque demande d'API via l'événement SF 'kernel.request'. Le problème est que mon abonné d'événement ne semble pas être distribué correctement, je suppose que LexikJWTAuthBundle détecte avant que je n'ai aucun JWT dans ma demande et me renvoie 401 réponses.L'événement 'kernel.request' ne se distribue pas correctement

L'abonné de l'événement:

<?php 

namespace MyApp\APIBundle\EventListener; 

use MyApp\APIBundle\Controller\TokenAPIController; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\HttpKernel\KernelEvents; 

class RequestAPIListener implements EventSubscriberInterface 
{ 
    /** 
    * @var string Token API 
    */ 
    private $apiToken; 

    public function __construct(string $apiToken = null) 
    { 
     $this->apiToken = $apiToken; 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public static function getSubscribedEvents() 
    { 
     // dump('hi'); <---- This is execute when uncomment 
     // die; 
     return [ 
      KernelEvents::REQUEST => [ 
       'onRequest' 
      ] 
     ]; 
    } 

    public function onRequest(GetResponseEvent $event) 
    { 
     dump($event, $this->apiToken); <---- This is not execute 
     die; 

     $request->headers->set('Authorization', "Bearer $token"); 
    } 
} 

L'abonné événement Définition:

services: 
    myapp.api_bundle.event_listener.request_api: 
     class: MyApp\APIBundle\EventListener\RequestAPIListener 
     arguments: ['@=service("service_container").get("session").get("api_token")'] 
     tags: 
      - { name: kernel.event_subscriber } 

Comment puis-je résoudre ce problème? Ou peut-être si vous connaissez une autre façon d'ajouter automatiquement le jeton?

Répondre

0

Le problème était juste la priorité de mon écouteur personnalisé.

L'auditeur du pare-feu a été déclenché avant le mien, donc je mis une priorité plus élevée pour le mien:

public static function getSubscribedEvents() 
    { 
     return [ 
      KernelEvents::REQUEST => [ 
       ['onRequest', 10] 
      ] 
     ]; 
    }