Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php React Fetch to Laravel API创建新会话_Php_Laravel_Reactjs_Session_Fetch - Fatal编程技术网

Php React Fetch to Laravel API创建新会话

Php React Fetch to Laravel API创建新会话,php,laravel,reactjs,session,fetch,Php,Laravel,Reactjs,Session,Fetch,我的应用程序前端使用React,后端使用Laravel 5.4。我正在使用fetch()从后端请求数据。问题是页面加载时会创建两个会话。当发出POST请求时,CSRF中间件会抛出tokenmischException,因为发送的令牌与创建的第一个会话匹配,但它会检查第二个会话 我正在app.blade.php 并在获取配置中获取令牌 fetchConfig = { headers: { 'Content-Type': 'application/json',

我的应用程序前端使用React,后端使用Laravel 5.4。我正在使用
fetch()
从后端请求数据。问题是页面加载时会创建两个会话。当发出
POST
请求时,CSRF中间件会抛出
tokenmischException
,因为发送的令牌与创建的第一个会话匹配,但它会检查第二个会话

我正在
app.blade.php

并在获取配置中获取令牌

fetchConfig = {
    headers:  {
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
    },
    credentials: 'same-origin'
}}
以下是解密的会话:

a:3:{s:6:"_token";s:40:"7obvOzPaqqJDtVdij8RaqrvmTFLjKA2qnvYMxry6";s:9:"_previous";a:1:{s:3:"url";s:24:"http://localhost/page";}s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}}

a:3:{s:6:"_token";s:40:"5Aiws9Qy72YzlkfWX81zkhzrSeiMDYjFWiLeDAwN";s:9:"_previous";a:1:{s:3:"url";s:41:"http://localhost/api/page";}s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}}
请求URL:
http://localhost/page

API URL:
http://localhost/api/page


当React应用程序发出其初始
GET
请求时,如何防止创建新会话?

我不确定您的请求URL和目标API URL是什么。确保两者位于同一个域(包括子域)

我认为最好只对API路由禁用CSRF验证,因为其他域、本机应用程序等可能会使用这些路由

您可以通过添加以下类文件来实现这一点:app/Http/Middleware/VerifyCsrfToken.php

<?php

namespace App\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 = [
        'api/*',
    ];
}
了解Laravel如何使用CSRF检查

Laravel会为应用程序管理的每个活动用户会话自动生成CSRF“令牌”。此令牌用于验证经过身份验证的用户是否是实际向应用程序发出请求的用户:

API是无状态的。API中没有类似于会话的东西。所以你不应该在API中使用CSRF令牌。如果你查一下拉威尔。您将看到泰勒没有在API组中添加
VerifyCsrf
中间件。这表明
CSRF
仅用于具有会话的请求,即有状态请求。我建议您使用基于JWT的API身份验证系统。更多关于JWT的信息


您可以将此laravel包用于JWT:

您使用的是哪个会话驱动程序?我使用的是
文件
会话驱动程序。如果您将JWT Auth(JSON Web令牌身份验证)令牌用于laravel API。因为API无法维护状态。因此,如果您需要Csrf令牌验证,您必须将其作为私有声明存储在meta标记或JWT有效负载中。@bill您知道如何防止创建多个会话吗?谢谢您的回答!我将请求和api URL添加到问题中,因为它们隐藏在会话数据中。您的解决方案可以绕过csrf中间件,但仍在创建多个会话。如果可能的话,我希望能解决这个问题。
protected $middleware = [
    'csrf' => 'App\Http\Middleware\VerifyCsrfToken'
];