Laravel + Angular Project的Auth和CSRF令牌无法在Production中使用

时间:2016-10-14 19:02:54

标签: angularjs laravel-5

已经通过Angular添加了

csrf_token和X-XSRF-TOKEN

$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列表是空的。

更新:发现该会话在我的服务器项目中无效。

1 个答案:

答案 0 :(得分:2)

解决方案

Session无法正常工作的问题是,在我的项目的Config文件(在我的案例中为/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/views See @gbrock's answer

  • 删除文件缓存
  • 有人说要清除缓存并重启服务器。