从第三方API发布到Laravel 5

时间:2015-05-15 17:57:29

标签: laravel laravel-5 laravel-routing

我使用Laravel 5构建基本应用程序。

我使用的是第三方短信网关,它会将短信和POST结果发送到我的应用。我使用Postman for Chrome和Requestb.in

在本地测试它

我的问题: 当我尝试发布到我的应用程序时,我得到了一个"哎呀"来自Laravel的错误,状态码405。

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

在我的路线中,我有:

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

SMSController:

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

问题:这是问题,如果是,我该如何仅从一条路线禁用CSRF。

非常感谢!

4 个答案:

答案 0 :(得分: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/*',
    ];

答案 1 :(得分:1)

我刚刚意识到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',
    ];
}

答案 2 :(得分:0)

应该会出现令牌不匹配错误,遗憾的是CSRF已经出现了 - 这是一种扩展中间件并添加排除列表的方法:

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

答案 3 :(得分:0)

在尝试了与您同样的不同选项后,当我发现简单和简短的代码通过api/*中的所有app/Http/Middleware/VerifyCsrfToken.php调用时,我的搜索就停止了,只需替换此代码,

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

找到