我使用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。
非常感谢!
答案 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已经出现了 - 这是一种扩展中间件并添加排除列表的方法:
答案 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 = [
//
];
}
找到