Ich habe ein Zahlungssystem, bei dem Daten an eine Drittanbieter-Site gesendet und dann zurückgeholt werden…
Wenn Daten zurückgegeben werden, treffen sie auf eine bestimmte URL, sagen wir /ok route. $_REQUEST['transaction']
.
Aber wegen der Laravel-Middleware bekomme ich Token-Mismatch. Es gibt keine Möglichkeit, die Zahlungs-API von Drittanbietern Token zu generieren, also wie deaktiviere ich sie? nur für diese Strecke?
oder gibt es eine bessere möglichkeit?
Route::get('/payment/ok', 'TransactionsController@Ok');
Route::get('/payment/fail', 'TransactionsController@Fail');
public function Ok( Request $request )
{
$transId = $request->get('trans_id');
if ( isset( $transId ) )
{
return $transId;
}
}
Seit Version 5.1 Laravels VerifyCsrfToken Middleware ermöglicht die Angabe von Routen, die von der CSRF-Validierung ausgeschlossen sind. Um dies zu erreichen, müssen Sie die Routen zu hinzufügen $außer Array in deinem AppHttpMiddlewareVerifyCsrfToken.php Klasse:
<?php namespace AppHttpMiddleware;
use IlluminateFoundationHttpMiddlewareVerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier
{
protected $except = [
'payment/*',
];
}
Siehe die Dokumente für mehr Informationen.
Seit Laravel 7.7 können Sie Methode verwenden withoutMiddleware
z.B:
Route::get('/payment/ok', 'TransactionsController@Ok')
->withoutMiddleware([AppHttpMiddlewareVerifyCsrfToken::class]);
Route::get('/payment/fail', 'TransactionsController@Fail')
->withoutMiddleware([AppHttpMiddlewareVerifyCsrfToken::class]);
Die von @jedrzej.kurylo beschriebene Technik funktioniert gut, um eine oder zwei Seiten auszuschließen.
Hier ist eine andere Technik, wenn Sie viele Seiten von der CSRF-Validierung ausschließen müssen, mit mehr Zukunftssicherheit.
Sie können Ihre Routen segmentieren und auf jede unterschiedliche Middleware anwenden. So können Sie Ihre Zahlungsrouten in separate Routengruppen einteilen und VerifyCsrfToken nicht darauf anwenden. Hier ist wie.
1. Erstellen Sie eine Routendatei
Du wirst es in deinem . bemerken routes
Verzeichnis haben Sie folgenden Baum:
routes/
routes/api.php
routes/web.php
Erstellen Sie hier eine neue Datei, routes/payment.php
, und fügen Sie oben Ihre Routen hinzu:
<?php
use IlluminateSupportFacadesRoute;
Route::get('/payment/ok', 'TransactionsController@Ok');
Route::get('/payment/fail', 'TransactionsController@Fail');
2. Bearbeiten Sie die Route mit dem RouteServiceProvider
In Laravel werden Routen bearbeitet von appProvidersRouteServiceProvider.php
. Sie werden diese Funktionen bemerken: map()
und mapWebRoutes()
. Fügen Sie dieser Datei entsprechend hinzu (ich habe die Aktienkommentare der Kürze halber ausgeschlossen).
public function map()
{
$this->mapApiRoutes();
$this->mapWebRoutes();
$this->mapPaymentRoutes(); // <---- add this line
}
protected function mapWebRoutes()
{
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
}
protected function mapPaymentRoutes() // <--- Add this method
{
Route::middleware('payment') // <--- this line is important
->namespace($this->namespace)
->group(base_path('routes/payment.php'));
}
Beachten Sie, dass wir eine neue Middleware-Schicht hinzugefügt haben. Dies ist wichtig für den nächsten Schritt.
3. Fügen Sie eine neue Middleware-Schicht hinzu
Ihre Middleware für Ihre Routengruppen ist definiert in AppHttpKernel.php
.
Aktualisieren Sie die $middlewareGroups
Property, und fügen Sie einen mittleren Eintrag für ‘payment’ hinzu. Es kann genauso sein wie web
, aber ohne das VerifyCsrfToken
Linie.
protected $middlewareGroups = [
'web' => [
AppHttpMiddlewareEncryptCookies::class,
IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
IlluminateSessionMiddlewareStartSession::class,
IlluminateSessionMiddlewareAuthenticateSession::class,
IlluminateViewMiddlewareShareErrorsFromSession::class,
AppHttpMiddlewareVerifyCsrfToken::class,
IlluminateRoutingMiddlewareSubstituteBindings::class,
AppHttpMiddlewareNoClickjack::class,
AppHttpMiddlewareSecureReferrerPolicy::class,
AppHttpMiddlewareNoXssScripting::class,
],
// ********** Add this *******************
'payment' => [
AppHttpMiddlewareEncryptCookies::class,
IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
IlluminateSessionMiddlewareStartSession::class,
IlluminateSessionMiddlewareAuthenticateSession::class,
IlluminateViewMiddlewareShareErrorsFromSession::class,
// This is the line you want to comment-out / remove
// AppHttpMiddlewareVerifyCsrfToken::class,
IlluminateRoutingMiddlewareSubstituteBindings::class,
AppHttpMiddlewareNoClickjack::class,
AppHttpMiddlewareSecureReferrerPolicy::class,
AppHttpMiddlewareNoXssScripting::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
🎉.
Wenn Sie jetzt neue Routen hinzufügen, die von der CSRF-Token-Prüfung ausgeschlossen werden müssen, fügen Sie sie dem routes/payment.php
Datei.
.
laravel.com/docs/master/routing#csrf-exklusive-uris
– Raschi
30. Juli ’15 um 16:43
Welche Laravel-Version verwendest du? Wenn 5.1, siehe die Antwort unten. Wenn einige älter sind, lassen Sie es mich wissen und ich werde die Antwort aktualisieren, da es für ältere Versionen Möglichkeiten gibt, dies zu tun, nur etwas komplizierter.
– jedrzej.kurylo
30. Juli ’15 um 17:20
@jedrzej.kurylo Darf ich wissen, wie man CSRF-Token in Laravel 5.0 deaktiviert.
– Katastrophe
3. Juni ’19 um 5:37