CORS: Không thể sử dụng ký tự đại diện trong Access-Control-Allow-Origin khi cờ thông tin xác thực là true

327
ixaxaar 2013-11-03 05:18.

Tôi có một thiết lập liên quan đến

Máy chủ giao diện người dùng (Node.js, miền: localhost: 3000) <---> Phần phụ trợ (Django, Ajax, miền: localhost: 8000)

Trình duyệt <- webapp <- Node.js (Cung cấp ứng dụng)

Trình duyệt (ứng dụng web) -> Ajax -> Django (Cung cấp yêu cầu ajax POST)

Bây giờ, vấn đề của tôi ở đây là với thiết lập CORS mà ứng dụng web sử dụng để thực hiện các cuộc gọi Ajax đến máy chủ phụ trợ. Trong chrome, tôi tiếp tục nhận được

Không thể sử dụng ký tự đại diện trong Access-Control-Allow-Origin khi cờ thông tin xác thực là true.

cũng không hoạt động trên firefox.

Thiết lập Node.js của tôi là:

var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', 'http://localhost:8000/');
    res.header('Access-Control-Allow-Credentials', true);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
};

Và trong Django, tôi đang sử dụng phần mềm trung gian này cùng với

Ứng dụng web đưa ra các yêu cầu như sau:

$.ajax({
    type: "POST",
    url: 'http://localhost:8000/blah',
    data: {},
    xhrFields: {
        withCredentials: true
    },
    crossDomain: true,
    dataType: 'json',
    success: successHandler
});

Vì vậy, các tiêu đề yêu cầu mà ứng dụng web gửi đi trông giống như:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: "Origin, X-Requested-With, Content-Type, Accept"
Access-Control-Allow-Methods: 'GET,PUT,POST,DELETE'
Content-Type: application/json 
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: csrftoken=***; sessionid="***"

Và đây là tiêu đề phản hồi:

Access-Control-Allow-Headers: Content-Type,*
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE
Content-Type: application/json

Tôi làm sai ở đâu?!

Chỉnh sửa 1: Tôi đã sử dụng chrome --disable-web-security, nhưng bây giờ muốn mọi thứ thực sự hoạt động.

Chỉnh sửa 2: Trả lời:

Vì vậy, giải pháp cho tôi django-cors-headerscấu hình:

CORS_ORIGIN_ALLOW_ALL = False
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
    'http://localhost:3000' # Here was the problem indeed and it has to be http://localhost:3000, not http://localhost:3000/
)

9 answers

265
user568109 2013-11-03 07:31.

Đây là một phần của bảo mật, bạn không thể làm điều đó. Nếu bạn muốn cho phép thông tin xác thực thì bạn Access-Control-Allow-Originkhông được sử dụng *. Bạn sẽ phải chỉ định chính xác giao thức + miền + cổng. Để tham khảo, hãy xem những câu hỏi sau:

  1. Access-Control-Allow-Origin các miền phụ ký tự đại diện, cổng và giao thức
  2. Chia sẻ tài nguyên nguồn gốc chéo với thông tin đăng nhập

Bên cạnh đó *là quá dễ dãi và sẽ đánh bại việc sử dụng thông tin đăng nhập. Vì vậy, hãy đặt http://localhost:3000hoặc http://localhost:8000làm tiêu đề gốc cho phép.

41
Hamid 2017-08-26 14:30.

Nếu bạn đang sử dụng phần mềm trung gian CORS và bạn muốn gửi withCredentialboolean true, bạn có thể cấu hình CORS như sau:

var cors = require('cors');    
app.use(cors({credentials: true, origin: 'http://localhost:3000'}));
17
Bulkan 2013-11-03 05:22.

Nếu bạn đang sử dụng, expressbạn có thể sử dụng gói cors để cho phép CORS như vậy thay vì viết phần mềm trung gian của bạn;

var express = require('express')
, cors = require('cors')
, app = express();

app.use(cors());

app.get(function(req,res){ 
  res.send('hello');
});
12
Iron shield 2017-12-25 00:41.

thử nó:

const cors = require('cors')

const corsOptions = {
    origin: 'http://localhost:4200',
    credentials: true,

}
app.use(cors(corsOptions));
11
Squirrl 2019-05-18 05:22.

Nếu bạn muốn cho phép tất cả nguồn gốc và giữ thông tin xác thực, điều này phù hợp với tôi:

app.use(cors({
  origin: function(origin, callback){
    return callback(null, true);
  },
  optionsSuccessStatus: 200,
  credentials: true
}));
4
Renaud 2019-08-26 23:57.

Điều này phù hợp với tôi trong quá trình phát triển nhưng tôi không thể khuyên rằng trong sản xuất, đó chỉ là một cách khác để hoàn thành công việc chưa được đề cập nhưng có lẽ không phải là tốt nhất. Dù sao ở đây cũng đi:

Bạn có thể lấy nguồn gốc từ yêu cầu, sau đó sử dụng nguồn gốc đó trong tiêu đề phản hồi. Đây là cách nó trông như thế nào:

app.use(function(req, res, next) {
  res.header('Access-Control-Allow-Origin', req.header('origin') );
  next();
});

Tôi không biết điều đó sẽ như thế nào với thiết lập python của bạn nhưng điều đó sẽ dễ dàng dịch.

4
Christoph Hansen 2020-10-24 06:47.

Mở rộng trên ý tưởng @Renaud, cors hiện cung cấp một cách rất dễ dàng để thực hiện việc này:

Từ tài liệu chính thức của cors được tìm thấy ở đây :

" origin: Định cấu hình tiêu đề Access-Control-Allow-Origin CORS. Các giá trị có thể có: Boolean - đặt origin thành true để phản ánh nguồn gốc yêu cầu, như được xác định bởi req.header ('Origin') hoặc đặt thành false để tắt CORS . "

Do đó, chúng tôi chỉ cần làm như sau:

const app = express();
const corsConfig = {
    credentials: true,
    origin: true,
};
app.use(cors(corsConfig));

Cuối cùng, tôi nghĩ điều đáng nói là có những trường hợp sử dụng mà chúng tôi muốn cho phép các yêu cầu nguồn gốc chéo từ bất kỳ ai; ví dụ: khi xây dựng API REST công khai.

LƯU Ý: Tôi muốn để lại điều này như một bình luận về câu trả lời của anh ấy, nhưng rất tiếc là tôi không có điểm danh tiếng.

3
eriel marimon 2018-12-30 23:58.

(Chỉnh sửa) Tiện ích bổ sung được đề xuất trước đây không còn khả dụng nữa, bạn có thể thử tiện ích bổ sung này


Đối với mục đích phát triển trong Chrome, việc cài đặt tiện ích bổ sung này sẽ loại bỏ lỗi cụ thể:

Access to XMLHttpRequest at 'http://192.168.1.42:8080/sockjs-node/info?t=1546163388687' 
from origin 'http://localhost:8080' has been blocked by CORS policy: The value of the 
'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' 
when the request's credentials mode is 'include'. The credentials mode of requests 
initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

Sau khi cài đặt, hãy đảm bảo bạn thêm mẫu url của mình vào Intercepted URLsbằng cách nhấp vào biểu tượng AddOn's ( CORS , xanh lục hoặc đỏ) và điền vào hộp văn bản thích hợp. Mẫu URL mẫu để thêm vào đây sẽ hoạt động http://localhost:8080sẽ là:*://*

0
connectedMind 2020-07-01 02:49.

Gặp sự cố này với góc, sử dụng bộ đánh chặn xác thực để chỉnh sửa tiêu đề, trước khi yêu cầu được thực thi. Chúng tôi đã sử dụng mã thông báo api để xác thực, vì vậy tôi đã bật thông tin đăng nhập. bây giờ, có vẻ như nó không cần thiết / được phép nữa

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    req = req.clone({
      //withCredentials: true, //not needed anymore
      setHeaders: {
        'Content-Type' : 'application/json',
        'API-TOKEN' : 'xxx'
      },
    });
    
    return next.handle(req);
  }

Bên cạnh đó, không có tác dụng phụ ngay bây giờ.

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Tận dụng lợi thế của việc bán hàng nhân Ngày của Cha này

Tận dụng lợi thế của việc bán hàng nhân Ngày của Cha này

Màn hình Samsung Galaxy S9 Plus. Chủ nhật này là Ngày của Cha⁠ — trong trường hợp nó khiến bạn suy nghĩ — và thay vì mua cho anh ấy một chiếc cà vạt trong năm nay, có lẽ đã đến lúc bạn mua cho anh ấy thứ mà anh ấy sẽ thực sự sử dụng.

Assassin's Creed Snuck Into Monster Hunter: World Last Night

Assassin's Creed Snuck Into Monster Hunter: World Last Night

Monster Hunter: World yêu thích các sự kiện chéo. Dù có nghĩa là hóa trang thành Dante của Devil May Cry, giả dạng Horizon: Zero Dawn's Aloy, hay chiến đấu với quái vật Final Fantasy, các nhiệm vụ sự kiện khác nhau của Thế giới được nâng cấp tự do so với các trò chơi khác.

Ava DuVernay Có Quà Tặng Ngày Của Mẹ cho Tất Cả Chúng Ta: Nếp Nhăn Thời Gian Sẽ Được Viết Lại Vào Cuối Tuần Ngày Của Mẹ!

Ava DuVernay Có Quà Tặng Ngày Của Mẹ cho Tất Cả Chúng Ta: Nếp Nhăn Thời Gian Sẽ Được Viết Lại Vào Cuối Tuần Ngày Của Mẹ!

Storm Reid, Oprah Winfrey, Mindy Kaling, Reese Witherspoon và Ava DuVernay tại buổi chiếu đặc biệt của A Wrinkle in Time tại Nhà hát Walter Reade ở Thành phố New York vào ngày 7 tháng 3 năm 2018 “Ava rất mong được nói chuyện với bạn,” một trong những người của Array dư luận viên nói qua điện thoại. (Array là tập thể phân phối, nghệ thuật và vận động chính sách của Ava DuVernay tập trung vào các bộ phim của người da màu và phụ nữ.

Nhiệm vụ bất khả thi 5 sẽ khôi phục niềm tin của bạn trong phim hành động Tentpole

Nhiệm vụ bất khả thi 5 sẽ khôi phục niềm tin của bạn trong phim hành động Tentpole

Mission Impossible: Rogue Nation bắt đầu ở một cấp độ khác. Theo nghĩa đen.

Edwin McCain ra mắt Grand Ole Opry: Quay cảnh hậu trường với nhạc sĩ 'I'll Be'

Edwin McCain ra mắt Grand Ole Opry: Quay cảnh hậu trường với nhạc sĩ 'I'll Be'

McCain, người đang làm việc cho một album mới, lần đầu tiên bước vào vòng kết nối vào tối thứ Sáu ở Nashville

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Tôi viết như thế nào

Tôi viết như thế nào

Đối với tôi, mọi thứ là về dòng đầu tiên đó và nó sẽ đưa bạn đến đâu. Một số nhà văn bị điều khiển bởi cốt truyện, sự sắp xếp tinh tế của các quân cờ, trong khi những người khác bị lôi cuốn bởi một nhân vật và khả năng thực hiện một cuộc hành trình với một người bạn hư cấu mới.

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Language