Laravel(在前后端分离时)的api(post请求)如何验证X-CSRF-TOKEN
参考1:https://segmentfault.com/q/1010000003038534 《aravel 在做api接口的时候如何验证 X-CSRF-TOKEN》
参考2:https://laravel-china.org/docs/laravel/5.4/csrf/1228#CSRF- 《Laravel 下的伪造跨站请求保护 CSRF》
写api时本身就不需要验证csrf,因为已经前后端分离或者app与后端分离的,拿不到CSRF-TOKEN。
设置一组并不需要 CSRF 保护的 URI。例如,如果你正在使用 Stripe 处理付款并使用了他们的 webhook 系统,你会需要将 Stripe webhook 处理的路由排除在 CSRF 保护外,因为 Stripe 并不知道发送给你路由的 CSRF 令牌是什么。
这样,为了避免本不需要的CSRF验证,就需要执行laravel的CSRF验证白名单。
具体举例如下:
1. 设置一个Route
Route::post('post', "[email protected]");
2. 在控制器里面设置接受参数函数
自己随便建一个控制器,比如Controller.php
namespace App\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request; // 接收参数
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
public function post(Request $request){
$user = $request->input("user"); // 这里接收参数比thinkphp里面接收参数的input()要提前生命参数
$name = $request->input("name");
$msg = "post yes";
$back = [
"state"=>1,
"msg"=>$msg,
"name"=>$name,
"user"=>$user,
];
return json_encode($back, JSON_UNESCAPED_UNICODE); // js接收TP返回来的是string,而Lvl返回object。
}
}
3. 设置排除CSRF排除白名单
VerifyCsrfToken.php 中填写post接口名称
4. 前台post请求
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0">
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<title>载入中..</title>
</head>
<body>
<p></p>
<script>
(function () { // 登录状态自检
// 请求数据
$.ajax({
url: "http://localhost/laravel55/public/index.php/post",
type: "POST",
dataType: "json",
async: true,
data: { // 字典数据
user: 110,
name: "张三",
},
success: function(data, status){
if(typeof data === "string"){ // TP返回string???
console.log("post返回数据:" + data+";status:"+status+";返回数据的类型:"+typeof data);
datas = JSON.parse(data);
}else { // Lvl返回object???
console.log("post返回数据:" + JSON.stringify(data)+";status:"+status+";返回数据的类型:"+typeof data);
datas = data;
}
if (datas.state===0){
console.log("post请求被拒绝");
}else if (datas.state===1) {
console.log("post请求成功");
console.log(datas.msg);
$("p").html(datas.msg);
}
},
error: function (xhr) {
console.log(xhr);
}
});
})();
</script>
</body>
</html>
如图,post请求成功。
-