Laravel身份验证会话cookie未发送

3

我有一个相当基本的Laravel登录脚本

$email = Input::get('email');
$password = Input::get('password');
if(Auth::attempt(array('Email'=>$email, 'password'=>$password), true)){
    return Response::json(array('success' => true,'logged_in'=>Auth::check() ));
}

我使用有效的电子邮件和密码进行登录。我将“logged_in”放入响应数组中,只是为了进行测试,在尝试后返回值为true。然而,“laravel_session” cookie没有在响应中返回,随后的调用并未看到用户已登录。这仅发生在我的生产服务器上,我的本地环境和测试环境都没有问题。
另外一点,我注意到Response::json返回文本/ html MIME类型,而不是application/json。我不确定是什么原因导致了这种情况,所以我只是将jQuery.ajax dataType设置为“json”,以绕过这个问题。这也仅在我的生产服务器上发生。我已经没有任何想法了,非常感谢您的帮助。
4个回答

16
在我的一个配置文件中,有人(可能是我)在 PHP 文件的 <? 开始之前插入了一个空格。这是在设置任何头信息之前完成的,因此不能更改头信息(意味着无法设置 Cookie),因为数据已经被写入了输出流。所以,如果你正在寻找为什么会发生这种情况,请确保查找该问题。

0

由于我曾经遇到过类似的问题,还有一个可能是:

您忘记使用“web”中间件组。

'web' => [
    \App\Http\Middleware\EncryptCookies::class,
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    // ... and more
],

如果您不这样做,排队的 cookie 将永远不会被设置。


0

很可能,您的控制器工作得很好并且正确地设置了cookie。但是您的浏览器无法保存您的cookie。这是由于标头域限制引起的。

您能确定您的cookie系统工作得好吗?您可以检查app/config/session.php域字段是否如下所示。

'domain' => null,

你是指 app/config/session 吗?那里的 'domain'=null。数据库中没有 'domain' 设置。 - The Dancing Panda
Chrome开发者工具没有显示任何响应cookie。 - The Dancing Panda

0

尝试移除第二个布尔参数 (Auth::check(array, boolean)) 或者检查您的用户表是否有 remember_token 列。

如果您想要在您的应用程序中提供 "记住我" 功能,您可以将 true 作为 attempt 方法的第二个参数,这将使用户永久保持已认证状态(或者直到手动注销)。当然,您的用户表必须包括字符串 remember_token 列,该列将用于存储 "记住我" 令牌。

此外,您的代码可能有缺陷 (您可能打了一个错字) 或者您的数据库结构很奇怪,因为电子邮件字段使用大写字母。

array('Email'=>$email, 'password'=>$password)

array('email'=>$email, 'password'=>$password)

remember_token已经存在,我希望用户被记住,但我会尝试将其删除以查看是否有所帮助。数据库结构很奇怪。我喜欢大写字母。 - The Dancing Panda
为什么是Email和password而不是Email和Password?虽然我建议你检查一下,因为这不是一个好的做法。祝你好运。 - Matías Chomicki
在数据库中,密码是大写的。但是由于Laravel与attempt的工作方式,它要求密码以小写形式使用自动哈希机制。实际上登录是有效的,没有错误,并且Auth :: check()返回true。 - The Dancing Panda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接