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]");

Laravel(在前后端分离时)的api(post请求)如何验证X-CSRF-TOKEN

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。
    }

}

Laravel(在前后端分离时)的api(post请求)如何验证X-CSRF-TOKEN

3. 设置排除CSRF排除白名单

VerifyCsrfToken.php 中填写post接口名称

Laravel(在前后端分离时)的api(post请求)如何验证X-CSRF-TOKEN

 

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请求成功。

Laravel(在前后端分离时)的api(post请求)如何验证X-CSRF-TOKEN

-