Auth :: user()返回带有CORS请求的null

Mic*_*ley 6 cors laravel

我在子域上有一个单独的REST API的站点,例如api.mysite.com,我发送CRUD请求.API子域具有此过滤器,为响应添加适当的标头:

// 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');
});
Run Code Online (Sandbox Code Playgroud)

我还设置crossdomain: truexhrFields: { withCredentials: true }我的jQuery的$.ajax请求.请求设法通过服务器,访问适当的路由等,但身份验证过程出现问题.每次,Laravel就像用户没有登录一样,导致请求Auth::user()返回null.检查Firebug中的请求显示Cookie标头是在带有Laravel会话ID的请求中发送的,但是服务器响应SetCookie,就像尝试启动新会话一样.我可能在这里做了一些愚蠢的事情,但我最终试图确定是什么.

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

Mic*_*ley 4

我终于弄明白了。

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

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

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

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