【问题标题】:Laravel+Angular Project's Auth and CSRF token not working in ProductionLaravel+Angular 项目的 Auth 和 CSRF 令牌在生产环境中不起作用
【发布时间】:2017-02-24 07:25:16
【问题描述】:

csrf_token 和 X-XSRF-TOKEN 已通过 Angular 添加

$http.defaults.headers.common['csrf_token'] = CSRF_TOKEN;
$http.defaults.headers.common['X-XSRF-TOKEN'] = X_XSRF_TOKEN;

该项目在本地服务器上运行良好,但在生产中却不行。提交表单后我看到 TokenMismatchException 并且 Auth::attempt() 在登录期间工作正常。但是登录后,当我通过 Auth::user()->id 访问其他路由的用户 ID 时,我看不到登录用户。

我还在本地服务器中检查了我的 cookie。我可以在那里看到 XSRF-TOKEN 和 laravel-session,但在生产中我的 cookie 列表是空的。

更新:发现会话在我的服务器项目中不起作用。

【问题讨论】:

  • 您是否要通过表单上传大文件?
  • 只给定一个文本字段。

标签: angularjs laravel-5


【解决方案1】:

解决方案

会话不工作的问题是在我的项目的配置文件(在我的情况下为 /config/google-geocoder.php)中的 PHP 开始标记(<?php)之前存在一个空行。这就是为什么 Laravel 无法在 cookie 列表中创建任何会话(使用 laravel 的默认 XSRF-token 和 laravel-session)。从链接中查看@codesidekick 的答案,这对我解决这个问题有很大帮助。 CSRF - Form Token Doesn't Match Session Token

为什么 localhost 没有遇到这个问题?

我无法确切说明原因,但我的本地服务器具有 PHP 版本 5.5.9-1ubuntu4.19,而生产服务器具有 5.5.30。我认为由于配置上的一些差异,我在生产中遇到了问题。

可能产生此问题的问题列表

在调查过程中,我发现有几个问题可能会导致此问题。我也在下面的列表中包含了我的一个。

  • 如果您在浏览器的源代码<!DOCTYPE html> 之前看到任何空行,则您的页面的相关文件在打开 PHP 标记之前有空行。在这种情况下,检查您为页面创建的实际 PHP 文件,如果没有,则查看 Laravel 的默认加载文件(index.php、routes.php、配置文件等),并确保 PHP 之前没有空格您错误添加的开始标签。
  • 会话中数据存储后是否有任何回声。
  • 如果您在结束标记后有任何空格。 See here
  • 如果您只有令牌不匹配,则将令牌全局 <meta name="_token" content="{!! csrf_token() !!}"/> 添加到您的标题中或在您的表单中本地添加 <input type="hidden" name="_token" value="{ csrf_token() }">。对于ajax调用

     $.ajaxSetup(
    {
        headers:
        {
            'X-CSRF-Token': $('input[name="_token"]').val()
        }
    });
    
  • 检查/store/framework/Session 是否有权限存储会话,因为默认情况下 Laravel 具有文件类型会话。您可以尝试数据库会话,我看到它对某些人有效。你也可以尝试从storage/framework/sessionsstorage/framework/viewsSee @gbrock's answer删除文件缓存

  • 有人说清缓存重启服务器。

【讨论】:

    猜你喜欢
    • 2019-05-13
    • 2020-06-22
    • 2018-07-20
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多