【问题标题】:Laravel 5.5 Manually Validating CSRF TokenLaravel 5.5 手动验证 CSRF 令牌
【发布时间】:2018-07-13 21:18:57
【问题描述】:
我正在构建一个 api 驱动的 Laravel 5.5 应用程序。我也想使用可公开访问的 api 来处理 UI 驱动的请求。
我的问题是,在我的 api auth 中间件中,检测 UI 驱动请求(ajax 请求)并允许它通过而不尝试验证 api auth 凭据的最佳方法是什么? (也许尝试验证 csrf 令牌?)
【问题讨论】:
标签:
php
laravel
api
laravel-5.5
【解决方案1】:
您可以使用中间件添加对 CSRF 令牌的额外检查,尽管 Laravel 默认在 Web 路由上执行此操作 (Doc)。
例如,添加此中间件以防止从除 ajax 之外的任何内容进行访问:
运行这个命令:
php artisan make:middleware AllowOnlyAjaxRequests
然后在中间件文件中:
namespace App\Http\Middleware;
use Closure;
class AllowOnlyAjaxRequests
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(!$request->ajax()) {
// Handle the non-ajax request
return response('', 405);
}
return $next($request);
}
}
然后将'ajax' => \App\Http\Middleware\AllowOnlyAjaxRequests::class, 添加到app/Http/Kernel.php 中的routeMiddleware 数组中
(Middleware Docs)
要检测通过 ajax 发送的请求,您可以使用 $request->ajax() 代码。
如果您想从验证 CSRF 中排除某些 URI(请谨慎操作),您可以使用 this。
【解决方案2】:
您可以在 VerifyCsrfToken 中间件中排除特定路由检查 csrf 令牌。
在控制器中验证请求时将其排除后,如果 $request->ajax() 返回 false,则可以验证 csrf 令牌。
您可以使用 Session::token() 或 csrf_token() 函数来验证 csrf。
希望这会对你有所帮助。