Post 到 Laravel 5 来自第 3 方 API
Post to Laravel 5 from 3rd party API
我正在使用 Laravel 5 构建一个基本应用程序。
我正在使用第三方 SMS 网关,它接收 SMS 并将结果POST
发送到我的应用程序。我在本地使用 Postman 对 Chrome 和 Requestb.in
进行测试
我的问题:
当我尝试 POST 我的应用程序时,我从 Laravel 收到 "whoops" 错误,状态代码 405。
我的直觉:
我觉得这是因为默认的 CSRF 失败。该请求来自我的应用生态系统之外。
在我的路线中我有:
Route::post('/sms/', 'SMSController@create');
短信控制器:
public function create(Request $request)
{
//keeping it simple for now
return view('hello');
}
问题:这是问题所在吗?如果是,如何仅从一个路由禁用 CSRF。
非常感谢!
应该会出现令牌不匹配错误,不幸的是,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);
}
Update
According to Laravel Documentation, from Laravel 5.1+ you are
able to define the URIs that should be excluded from CSRF verification
by adding them to the $except
property of the VerifyCsrfToken
middleware.
<?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',
];
}
像你们一样尝试了不同的选项后,当我找到简单而简短的代码来传递 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
我正在使用 Laravel 5 构建一个基本应用程序。
我正在使用第三方 SMS 网关,它接收 SMS 并将结果POST
发送到我的应用程序。我在本地使用 Postman 对 Chrome 和 Requestb.in
我的问题: 当我尝试 POST 我的应用程序时,我从 Laravel 收到 "whoops" 错误,状态代码 405。
我的直觉: 我觉得这是因为默认的 CSRF 失败。该请求来自我的应用生态系统之外。
在我的路线中我有:
Route::post('/sms/', 'SMSController@create');
短信控制器:
public function create(Request $request)
{
//keeping it simple for now
return view('hello');
}
问题:这是问题所在吗?如果是,如何仅从一个路由禁用 CSRF。
非常感谢!
应该会出现令牌不匹配错误,不幸的是,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);
}
Update
According to Laravel Documentation, from Laravel 5.1+ you are able to define the URIs that should be excluded from CSRF verification by adding them to the
$except
property of the VerifyCsrfToken middleware.
<?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',
];
}
像你们一样尝试了不同的选项后,当我找到简单而简短的代码来传递 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