2017-09-29 2 views
0

Ich baue eine Anwendung über schlanke Rahmen und es ist Slim-JWT-Auth Middleware.PHP, JWT Passthrough Pfad und Methode

Ich habe es installiert, und es funktioniert gut, aber ich bin ein bisschen verwirrt mit der Passthrough Möglichkeit.

Mein RequestPathRule:

new \Slim\Middleware\JwtAuthentication\RequestPathRule([ 
      "path" => ["/api"], 
      "passthrough" => ["/api/auth", "/api/users", "/api/products", "/api/orders", "/api/streets", 
           "/api/reservations", "/api/feedbacks", "api/menu"] 
     ]) 

Und mein RequestMethodRule:

new \Slim\Middleware\JwtAuthentication\RequestMethodRule([ 
      "passthrough" => ["POST", "GET"] 
     ]) 

Aber es erlaubt, diese Methoden zu allen Endpunkten. Eigentlich möchte ich POST nur auf /api/auth, /api/orders, /api/reservations und /api/feedbacks lassen, und GET für jeden Endpunkt außer /api/users.

Wie ist das möglich?

Vielen Dank im Voraus.

Antwort

2

Es wäre interessant zu sehen, welche sind Ihre Routen, aber im Grunde in der aktuellen Konfiguration Ihr sagen:

1) Authentifizieren NICHT "/ api/Auth", "/ api/users", "/api/products ","/api/orders ","/api/roads ","/api/reservations ","/api/feedbacks "und" api/menu "(der Rest der Endpoints unter/api MUSS authentifiziert werden)

2) und auch die Authentifizierung nicht unabhängig von POST oder GET Anfrage

einige Beispiele:

  • PUT /api/users wird NIE authentifizieren, da/api/Benutzer in RequestPathRule ist
  • GET /api/users wird nie authentifizieren, da/api/Benutzer in RequestPathRule ist und erhalten Sie in RequestMehtodRule ist
  • PUT /api/whatever IMMER da/api authentifizieren werden/Benutzer ist NICHT in RequestPathRule AND GET ist in RequestMethodRule NICHT

Grundsätzlich Regeln wie eine OR-Vergleichsoperator und im richtigen Moment arbeiten ein Endpunkt ist in RequestP athRule OR eine Anfrage-Methode ist in RequestMethodRule die Anfrage wird nicht authentifiziert werden.

Ein besserer Ansatz könnte sein, zu versuchen, RequestMethodRule nicht so oft wie möglich zu verwenden (im Allgemeinen fügen Sie einfach die OPTIONS-Methode hinzu) und mit unterschiedlichen Pfaden zu spielen.

In einer normalen Web-Anwendung finden Sie einen öffentlichen API Weg zu Ihren Kunden unter /api bieten und der einzige Endpunkt Sie authentifizieren im Allgemeinen nicht ist /api/login (oder /api/auth in Ihrem Beispiel) der Rest des Endpunkts unter /api authentifiziert werden. Wenn Sie einen anderen Satz von Endpunkten bereitstellen, die Sie nicht authentifizieren möchten, geben Sie einen anderen Pfad ein, z. B. /service, und Sie enthalten ihn nicht als "Pfad" in RequestPathRule. Wenn Sie eine Gruppe von authentifizierten Endpunkt-ALL benötigen, erstellen Sie alle von dann unter einem neuen Pfad, sagen wir /admin und Sie fügen Pfad in RequestPathRule hinzu, und Sie fügen kein "Passthrough" für sie hinzu.

Also die Idee ist mit anderen Pfad spielen und fügen Sie einfach diese Methoden unter RequestMethodRule für bestimmte Anwendungsfälle. Außerdem haben Sie auf diese Weise eine klarere und übersichtlichere API.

Wenn Sie Ihre Endpunkte betrachten, empfehle ich Ihnen, für die meisten von ihnen einen anderen Pfad zu erstellen, anstatt "/ api/auth", "/ api/users", "/ api/products", "/ api/orders" Ich würde vorschlagen, dass Sie "/ auth", "/ user", "/ product", "/ order" ... und Sie können für jeden Pfad eine RequestPathRule und RequestMethodRule hinzufügen.

Um ehrlich zu sein, wie die Slim-JWT-Auth-Middleware gedacht ist, ist es schwierig, CRUD-Operationen über denselben Endpunkt bereitzustellen, sagen wir, Sie haben GET, POST, PUT und DELETE über /user und Sie möchten nur POST, PUT authentifizieren und LÖSCHEN. Für diesen Fall können Sie zwei Möglichkeiten:

  1. für jedes Verb differen Endpunkt erstellen wie: GET /user/all, POST /user/add, PUT /user/edit und DELETE /user/delete (was eine schlechte Praxis
  2. ist Ihr RequestPathRule und RequestMethodRule aufrufbar mit dem einzigen erstellen oder erweitern Bedingungen, dass sie RuleInterface und passen sie an Ihre Bedürfnisse (sehr empfehlenswert)

Wenn Sie die zweite Option wählen, müssen Sie nur diejenigen aufrufbar zum rules Optio hinzufügen implementieren müssen n. So etwas wie dieses:

$app->add(new \Slim\Middleware\JwtAuthentication([ 
"rules" => [ 
    new \My\Auth\Rules\RequestPathRule([ 
     "path" => "/", 
     "passthrough" => [] 
    ]), 
    new \My\Auth\Rules\RequestMethodRule([ 
     "passthrough" => ["OPTIONS"] 
    ]) 
] 
])); 
+0

Einverstanden. # 2 ist die beste Lösung. –