我使用Laravel 5建立一个基本的应用程序。
我使用第三方短信网关这需要短信和POST
的结果,我的应用程序。 我在本地测试它使用邮差为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。
非常感谢!
你可以改变处理方法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文档 ,从Laravel 5.1+你可以将它们添加到定义应该从CSRF验证中排除的URI的$except
在VerifyCsrfToken中间件的性能。
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier
{
protected $except = [
'sms/*',
];
我刚刚意识到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',
];
}
应该得到令牌不匹配错误,不幸的是CSRF是烤 - 这里是一个方法来扩展中间件,加入的排除列表:
https://laracasts.com/discuss/channels/general-discussion/l5-disable-csrf-middleware-on-certain-routes
试图像你所有不同的选项后,我的搜索停止,当我发现简单的短代码通过所有的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