【问题标题】:Post to Laravel 5 from 3rd party API从 3rd 方 API 发布到 Laravel 5
【发布时间】:2015-07-27 18:08:43
【问题描述】:

我正在使用 Laravel 5 构建一个基本应用程序。

我正在使用第三方 SMS 网关,它将 SMS 和 POST 结果发送到我的应用程序。我正在使用 Postman for Chrome 和 Requestb.in 在本地测试它

我的问题: 当我尝试 POST 到我的应用程序时,我从 Laravel 收到“哎呀”错误,状态码 405。

我的预感: 我有一种感觉,这是因为默认 CSRF 失败。该请求来自我的应用生态系统之外。

在我的路线中:

Route::post('/sms/', 'SMSController@create');

短信控制器:

public function create(Request $request)
    {
       //keeping it simple for now
        return view('hello');
    }

问题:这是问题所在吗?如果是这样,如何仅从一条路由禁用 CSRF。

非常感谢!

【问题讨论】:

    标签: laravel laravel-5 laravel-routing


    【解决方案1】:

    应该得到一个令牌不匹配错误,不幸的是 CSRF 被烘焙了 - 这是一种扩展中间件并添加排除列表的方法:

    https://laracasts.com/discuss/channels/general-discussion/l5-disable-csrf-middleware-on-certain-routes

    【讨论】:

    • 你应该发布相关代码和你的答案如果明天你发布的链接不再可用怎么办?
    【解决方案2】:

    您可以更改app/Http/Middleware/VerifyCsrfToken.php 中的句柄方法来执行此操作。

    class VerifyCsrfToken extends BaseVerifier {
    
        protected $excludes = [ // Route patterns
            'sms',
            'sms/*'
        ];
    
        public function handle($request, Closure $next)
        {
            foreach ($this->excludes as $pattern) 
            {
                if ($request->is($pattern)) 
                {
                    return $next($request);
                }
            }
    
            return parent::handle($request, $next);
        }
    

    更新

    根据Laravel Documentation,从 Laravel 5.1+ 你是 能够定义应该从 CSRF 验证中排除的 URI 通过将它们添加到 VerifyCsrfToken 的 $except 属性 中间件。

    <?php
    
    namespace App\Http\Middleware;
    
    use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
    
    class VerifyCsrfToken extends BaseVerifier
    {
        protected $except = [
            'sms/*',
        ];
    

    【讨论】:

    • 我会创建一个数组而不是变量,并使用 in_array 而不是比较值。
    • @zeratulmdq 我通过定义一个排除数组来改进它。
    【解决方案3】:

    我刚刚意识到 L5 现在将排除列表作为一项功能:

    <?php namespace APPNAMESPACE\Http\Middleware;
    
    use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
    
    class VerifyCsrfToken extends BaseVerifier
    {
        /**
         * The URIs that should be excluded from CSRF verification.
         *
         * @var array
         */
        protected $except = [
              'example1',
              'example2/example3',
        ];
    }
    

    【讨论】:

      【解决方案4】:

      像你们一样尝试不同的选项后,当我找到简单而简短的代码来传递app/Http/Middleware/VerifyCsrfToken.php 中的所有api/* 调用时,我的搜索停止了,只需替换此代码,

      public function handle($request, Closure $next)
      {   
          if( ! $request->is('api/*')){
              return parent::handle($request, $next); 
          }
      
          return $next($request);
      }
      

      它就像 Laravel 5 中的魅力一样。虽然,新的 laravel 5.1 可以使用此代码完成,

      class VerifyCsrfToken extends BaseVerifier
      {
          /**
           * The URIs that should be excluded from CSRF verification.
           *
           * @var array
           */
          protected $except = [
              //
          ];
      }
      

      可以在这里找到Laravel VerifyCsrfToken.php

      【讨论】:

        猜你喜欢
        • 2018-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-15
        • 2016-11-15
        • 1970-01-01
        • 2014-08-16
        相关资源
        最近更新 更多