Gửi thông tin đăng nhập với các bài đăng trên nhiều miền?


81

Theo Yêu cầu với thông tin đăng nhập , Firefox sẽ chỉ gửi thông tin đăng nhập cùng với các bài đăng trên nhiều miền nếu

invocation.withCredentials = "true";

được thiết lập… Nhưng có vẻ như API Ajax của jQuery không cung cấp bất kỳ cơ chế nào cho việc này.

Có điều gì tôi đã bỏ lỡ? Có cách nào khác mà tôi có thể làm được không?

Câu trả lời:


168

Chức năng được cho là bị hỏng trong jQuery 1.5.

Kể từ jQuery 1.5.1, bạn nên sử dụng xhrFields param.

$.ajaxSetup({
    type: "POST",
    data: {},
    dataType: 'json',
    xhrFields: {
       withCredentials: true
    },
    crossDomain: true
});

Tài liệu: http://api.jquery.com/jQuery.ajax/

Đã báo cáo lỗi: http://bugs.jquery.com/ticket/8146


2
Bây giờ tôi có thể gửi cookie đến tên miền phụ :) Cảm ơn bạn!
Radek

7
Điều này cũng phải hoạt động cho các yêu cầu ajax chéo (không phải tên miền phụ)?
đèn đường

Tôi vẫn bị nhắc nhở cho thông tin
John Grabanski

@JohnGrabanski Bạn đã khắc phục được sự cố của mình chưa?
Selman

41

Bạn có thể sử dụng lệnh beforeSendgọi lại để thiết lập các tham số bổ sung (Đối XMLHTTPRequesttượng được chuyển cho nó làm tham số duy nhất của nó).

Bạn biết đấy, loại yêu cầu tên miền chéo này sẽ không hoạt động trong trường hợp trang web bình thường và không hoạt động với bất kỳ trình duyệt nào khác. Tôi thậm chí không biết FF 3.5 áp đặt những giới hạn bảo mật nào, vì vậy bạn đừng đập đầu vào tường mà không làm gì:

$.ajax({
    url: 'http://bar.other',
    data: { whatever:'cool' },
    type: 'GET',
    beforeSend: function(xhr){
       xhr.withCredentials = true;
    }
});

Một điều nữa cần lưu ý, đó là jQuery được thiết lập để chuẩn hóa sự khác biệt của trình duyệt. Bạn có thể thấy rằng thư viện jQuery có những giới hạn khác mà nó cấm loại chức năng này.


2
Theo api.jquery.com/jQuery.post nó phải type: "GET" chứ không phải phương pháp: 'GET' Tôi vấp nó khi sử dụng ví dụ của bạn
Xosofox

1
@Xosofox Tôi biết đây là một nhận xét cũ, nhưng đối với jQuery 1.9, method: 'GET'được hỗ trợ. api.jquery.com/jquery.ajax
Brad

1
Lưu ý rằng điều này không còn hoạt động trong jQuery 3+, vì (a) api của hàm này đã thay đổi và (b) nó không còn quyền truy cập vào đối tượng XHR, được tạo sau khi hàm này chạy. Thay vào đó, bạn nên sử dụng xhrFields.
cuniculus

2

Trong jQuery 3 và có lẽ các phiên bản trước đó, cấu hình đơn giản hơn sau đây cũng hoạt động cho các yêu cầu riêng lẻ:

$.ajax(
        'https://foo.bar.com,
        {
            dataType: 'json',
            xhrFields: {
                withCredentials: true
            },
            success: successFunc
        }
    );

Toàn bộ lỗi tôi gặp phải trong Firefox Dev Tools -> tab Network (trong tab Security cho một yêu cầu riêng lẻ) là:

Đã xảy ra lỗi khi kết nối với foo.bar.com. Máy ngang hàngSL không thể thương lượng một bộ thông số bảo mật được chấp nhận. Mã lỗi: SSL_ERROR_HANDSHAKE_FAILURE_ALERT

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.