【问题标题】: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 令牌?)

【问题讨论】:

  • 你在使用Laravel Passport吗?

标签: 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。

    希望这会对你有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-02-01
      • 2021-08-14
      • 2018-05-30
      • 1970-01-01
      • 2018-02-20
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      相关资源
      最近更新 更多