2014-04-24 21 views
6

Tôi có một trang web có API REST riêng biệt trên tên miền phụ, ví dụ: api.mysite.com, tôi gửi yêu cầu CRUD đến. API sub-domain có bộ lọc này thêm các tiêu đề phù hợp với phản ứng:Auth :: user() trả về null với các yêu cầu CORS

// 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'); 
}); 

Tôi cũng đang thiết crossdomain: truexhrFields: { withCredentials: true } theo yêu cầu jQuery $.ajax tôi. Các yêu cầu quản lý để đi qua máy chủ, nhấn các tuyến đường thích hợp, vv, nhưng một cái gì đó đang đi sai với quá trình xác thực. Mỗi lần, Laravel hoạt động như thể người dùng chưa đăng nhập, yêu cầu Auth::user() trả về null. Kiểm tra các yêu cầu trong Firebug cho thấy rằng tiêu đề Cookie được gửi trong yêu cầu với id phiên Laravel, nhưng máy chủ phản hồi với SetCookie, như thể đang cố bắt đầu một phiên mới. Tôi có thể làm điều gì đó ngu ngốc ở đây, nhưng tôi đang ở cuối trí thông minh của tôi cố gắng để xác định chỉ những gì.

Cập nhật: Từ một số lần gỡ lỗi, tôi đã tìm thấy điều gì đó thú vị. Không chắc nó có nghĩa là gì. Để truy cập trang được đề cập, người dùng phải đăng nhập. Do đó, có một cookie laravel_session trong trình duyệt khi trang tải. Sau đó tôi gửi một vài yêu cầu AJAX (tên miền chéo) bằng cách tương tác với trang. Yêu cầu đầu tiên không có tập hợp cookie nào cả và nhận được một tập hợp cookie laravel_session mới từ máy chủ. Yêu cầu thứ hai sau đó bao gồm cookie đó, nhưng phản hồi cho nó sẽ gửi lại một cookie mới khác, như thể back-end chưa bao giờ có bản ghi nhớ về lần đầu tiên. Tôi đang bắt đầu tự hỏi nếu điều này không phải là một cái gì đó để làm với các lĩnh vực cookie hoặc một số như vậy.

Trả lời

3

Cuối cùng tôi đã tìm ra.

Trước hết, bộ lọc xhr và tuyến đường được định cấu hình chính xác. Nguyên nhân gốc rễ của vấn đề này chắc chắn là một vấn đề về cookie.

Miền cookie cho laravel_session không được thiết lập ban đầu. Trình duyệt giải thích rằng đó là viết tắt của "miền hiện tại". Đó là, app.mysite.com Điều tôi cần làm là đặt giá trị trong cấu hình session.domain của Laravel thành ".mysite.com" Bằng cách đó, cookie phiên tương tự sẽ có sẵn cho app.mysite.com, api.mysite. com và bất kỳ tên miền phụ nào khác của mysite.com

Điều đó nói rằng, có hai gotchas mà tôi vấp trên đường đến giải pháp này:

  • Đầu tiên là cookie không thể được đặt cho tên miền cấp cao. Tôi thường thiết lập tên miền phát triển của mình thành một cái gì đó như "mysite", rời khỏi TLD. Theo như DNS là có liên quan, đó là một TLD, và các tập tin cookie sẽ thất bại. Khi tôi thay đổi tên miền giả của mình để phát triển thành "mysite.dev", "mysite" không còn là TLD nữa và trình duyệt đã chấp nhận cookie cho nó.
  • Điều thứ hai là tôi phải xóa cookie phiên của mình khỏi trình duyệt của mình trước khi tôi có thể đăng nhập vào miền mới và tên miền khác. Tôi không biết tại sao đây là trường hợp, nhưng hãy nhớ xóa cookie phiên của bạn khi thực hiện việc này.
    • Rõ ràng, điều này là quá nhiều để yêu cầu người dùng của bạn làm. Nếu bạn đang đặt loại thay đổi này vào một trang web đã được triển khai, bạn cần xem xét cách để người dùng của bạn di chuyển sang các thay đổi cookie.
    • Vì cookie phiên Laravel được đặt với thời gian hết hạn không quá xa trong tương lai, một tùy chọn đơn giản là triển khai các thay đổi đó khi người dùng của bạn không hoạt động và chấp nhận ứng dụng dường như bị hỏng cho đến khi tất cả cookie phiên hết hạn. Chỉ những người dùng hiện tại và đang hoạt động gần đây của bạn sẽ bị ảnh hưởng và "giải pháp" tốt và dễ dàng. Nhưng ứng dụng của bạn bị hỏng trong một thời gian.
    • Tùy chọn khác là thay đổi tên của cookie phiên khỏi "laravel_session" cùng lúc bạn thay đổi tên miền cookie. Bằng cách này, cookie mới nằm bên cạnh cái cũ trong khi các cookie cũ hết hạn và ứng dụng của bạn vẫn không bị gián đoạn.
+0

Tôi đang gặp sự cố với vấn đề này. Tôi đang tương tác với máy chủ laravel của tôi tại localhost: 8000 từ localhost: 9000. Cookie laravel_session có lưu trữ một người dùng được xác thực không? –

+0

Nó chỉ là một băm được sử dụng để tra cứu phiên của bạn. Nếu tôi nhớ chính xác, người dùng được xác thực sẽ được lưu trữ trong phiên làm ID. Hồ sơ người dùng thực tế sau đó được lấy từ cơ sở dữ liệu nếu bạn cố gắng sử dụng Auth :: user(); –

Các vấn đề liên quan