gpt4 book ai didi

laravel - Auth::user() 对于 CORS 请求返回 null

转载 作者:行者123 更新时间:2023-12-02 09:57:19 25 4
gpt4 key购买 nike

我的网站在子域上有一个单独的 REST API,例如api.mysite.com,我向其发送 CRUD 请求。 API 子域具有此过滤器,将适当的 header 添加到响应中:

// Simple CORS handling
Route::filter('cors', function($route, $request, $response) {
$origin = Request::header('Origin');
$host = parse_url($origin, PHP_URL_HOST);

// Don't send response for external domains.
if (!in_array($host, Config::get('domains'))) {
App::abort();
}

$response->headers->set('Access-Control-Allow-Origin', $origin);
$response->headers->set('Access-Control-Allow-Headers', 'Accept, Accept-Encoding, Accept-Language, Content-Length, Content-Type');
$response->headers->set('Access-Control-Allow-Methods', 'DELETE, GET, PATCH, POST, PUT');
$response->headers->set('Access-Control-Allow-Credentials', 'true');
});

我还在我的 jQuery $.ajax 请求上设置了 crossdomain: truexhrFields: { withCredentials: true } 。请求设法到达服务器,到达适当的路由等,但身份验证过程出现问题。每次,Laravel 都会表现得好像用户尚未登录,导致对 Auth::user() 的请求返回 null。在 Firebug 中检查请求表明 Cookie header 是在请求中使用 Laravel session id 发送的,但服务器以 SetCookie 进行响应,就像尝试启动新 session 一样。我可能在这里做了一些愚蠢的事情,但我束手无策,试图确定到底是什么。

更新:通过一些调试,我发现了一些有趣的东西。还不确定这意味着什么。要访问相关页面,用户必须登录。因此,当页面加载时,浏览器中会有一个 laravel_session cookie。然后,我通过与页面交互发送几个(跨域)AJAX 请求。第一个请求根本没有设置 cookie,并从服务器获取一个新的 laravel_session cookie 设置。然后,第二个请求包含该 cookie,但对其的响应会发回另一个新 cookie,就好像后端从未收到有关第一个请求的备忘录一样。我开始怀疑这是否与 cookie 域或类似内容有关。

最佳答案

我终于明白了。

首先,xhr 和路由过滤器都配置正确。这个问题的根本原因肯定是cookie问题。

最初未设置 laravel_session 的 cookie 域。浏览器将其解释为“当前域”的简写。也就是说,app.mysite.com 我需要做的是将 Laravel 的 session.domain 配置中的值显式设置为“.mysite.com”,这样,应用程序就可以使用相同的 session cookie .mysite.com、api.mysite.com 以及 mysite.com 的任何其他子域 问题已解决!

也就是说,我在实现此解决方案的过程中遇到了两个问题:

  • 首先是不能为 TLD 设置 Cookie。我通常将我的开发域设置为“mysite”之类的内容,省略 TLD。就 DNS 而言,这是一个 TLD,cookie 将会失败。一旦我将用于开发的假域名更改为“mysite.dev”,“mysite”就不再是 TLD,并且浏览器接受了它的 cookie。
  • 第二个是我必须从浏览器中删除 session cookie,然后才能登录到新的不同域。我不知道为什么会出现这种情况,但请记住在执行此操作时清除 session cookie。
    • 显然,要求用户做的事情太多了。如果您要将此类更改放入已部署的网站,则需要考虑如何让您的用户迁移到 Cookie 更改。
    • 由于 Laravel session cookie 设置的过期时间不会太远,因此一种选择是在用户不太活跃时简单地部署此类更改,并接受看起来已损坏的应用程序,直到所有 session cookie 过期。只有您当前和最近活跃的用户才会受到影响,并且“解决方案”很好且简单。但您的应用程序暂时无法使用。
    • 另一个选项是在更改 cookie 域的同时将 session cookie 的名称从“laravel_session”更改为其他名称。这样,新的 Cookie 会位于旧的 Cookie 旁边,而旧的 Cookie 会过期,并且您的应用程序不会受到损坏。

关于laravel - Auth::user() 对于 CORS 请求返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23271609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com