Bộ nhớ Firebase và Quyền truy cập-Kiểm soát-Cho phép-Nguồn gốc


86

Tôi đang cố tải xuống tệp từ Lưu trữ Firebase thông qua XMLHttpRequest, nhưng Access-Control-Allow-Origin không được đặt trên tài nguyên, vì vậy không thể thực hiện được. Có cách nào để đặt tiêu đề này trên máy chủ lưu trữ không?

  (let [xhr (js/XMLHttpRequest.)]
    (.open xhr "GET" url)
    (aset xhr "responseType" "arraybuffer")
    (aset xhr "onload" #(js/console.log "bin" (.-response xhr)))
    (.send xhr)))

Thông báo lỗi của Chrome:

XMLHttpRequest không thể tải https://firebasestorage.googleapis.com/[EDITED] Không có tiêu đề 'Access-Control-Allow-Origin' trên tài nguyên được yêu cầu. Nguồn gốc ' http: // localhost: 3449 ' do đó không được phép truy cập.


1
Không đủ rep cho một bình luận, nhưng cách trên vẫn là cách đúng đắn. Chỉ muốn chia sẻ tài liệu firebase chính thức trên tài liệu này: firebase.google.com/docs/storage/web/…
Andrew McOlash,

Câu trả lời:


172

Từ bài đăng này trên nhóm / danh sách firebase-talk :

Cách dễ nhất để định cấu hình dữ liệu của bạn cho CORS là bằng gsutilcông cụ dòng lệnh. Hướng dẫn cài đặt gsutilcó sẵn tại https://cloud.google.com/storage/docs/gsutil_install . Khi bạn đã cài đặt gsutilvà xác thực với nó, bạn có thể sử dụng nó để định cấu hình CORS.

Ví dụ: nếu bạn chỉ muốn cho phép tải xuống đối tượng từ miền tùy chỉnh của mình, hãy đặt dữ liệu này vào tệp có tên cors.json (thay thế "https://example.com"bằng miền của bạn):

[
  {
    "origin": ["https://example.com"],
    "method": ["GET"],
    "maxAgeSeconds": 3600
  }
]

Sau đó, chạy lệnh này (thay thế "exampleproject.appspot.com"bằng tên nhóm của bạn):

gsutil cors set cors.json gs://exampleproject.appspot.com

và bạn nên được thiết lập.

Nếu bạn cần cấu hình CORS phức tạp hơn, hãy xem tài liệu tại https://cloud.google.com/storage/docs/cross-origin#Configuring-CORS-on-a-Bucket .


5
Có cách nào để cho phép tất cả các nguồn tương tự như Access-Control-Allow-Origin: * không?
dooderson

5
Làm cách nào để tìm tên chính xác của nhóm firebase của tôi?
Jim

11
@ user1311069 chỉ cần sử dụng "origin": ["*"],thay vì"origin": ["https://example.com"],
rigdonmr

8
Firebase thực sự cần tìm ra cách thân thiện với người dùng để thực hiện điều này. Việc đặt quyền trên cơ sở dữ liệu Firebase thực tế gần như không gây khó chịu và cũng không phải là việc đặt quyền cho nhóm S3. Ưu tiên mạnh mẽ cho S3 tại thời điểm này.
Matt Jensen,

44
Nếu bạn không muốn cài đặt tiện ích, một cách hữu ích là truy cập console.cloud.google.com/home và nhấp vào “Kích hoạt Google Cloud Shell” ở trên cùng bên phải. Thao tác này sẽ mở một trình bao với gsutil đã được cài đặt và có quyền truy cập vào các dự án lưu trữ firebase của bạn. (trong vỏ i dùng pico để tạo ra một json, sau đó cũng làm gsutil cors set myjson.json gs://projectname.appspot.comnhư đã đề cập ở trên)
Eindbaas

47

Google Cloud hiện có một trình chỉnh sửa nội tuyến để làm cho quá trình này trở nên dễ dàng hơn. Không cần cài đặt bất cứ thứ gì trên hệ thống cục bộ của bạn.

  1. Mở bảng điều khiển GCP và bắt đầu phiên thiết bị đầu cuối đám mây bằng cách nhấp vào >_nút biểu tượng trong thanh điều hướng trên cùng.
  2. Nhấp vào biểu tượng bút chì để mở trình chỉnh sửa, sau đó tạo cors.jsontệp.
  3. Chạy gsutil cors set cors.json gs://your-bucket

nhập mô tả hình ảnh ở đây


Bị mắc kẹt ở bước 1. Vui lòng giải thích "và bắt đầu phiên thiết bị đầu cuối đám mây" Tôi mở bảng điều khiển và không thấy nút nào hoặc liên kết đến "bắt đầu phiên thiết bị đầu cuối đám mây"
fortesl 3/11/19

3
Đó là biểu tượng ở điều hướng trên cùng bên phải trông giống như thế>_
JeffD23

Có cách nào về phía trước để kéo cấu hình cors hiện có trước để đảo ngược nếu cần không?
David

Tôi đã thử điều này, nhưng nó không hoạt động.
user683742

Nó làm việc cho tôi
Sultanmyrza Kasymbekov

18

Chỉ muốn thêm vào câu trả lời. Chỉ cần đi tới dự án của bạn trong bảng điều khiển của Google (console.cloud.google.com/home) và chọn dự án của bạn. Ở đó, mở terminal và chỉ cần tạo tệp cors.json ( touch cors.json), sau đó làm theo câu trả lời và chỉnh sửa tệp này ( vim cors.json) theo đề xuất của @ Frank-van -uffelen

Điều này đã làm việc cho tôi. Chúc mừng!


Bảng điều khiển web tại console.cloud.google.com/home đã gây ra lỗi cho tôi, nhưng hoạt động tốt với Google Cloud SDK Shell.
FiringBlanks

3
... Có mở thiết bị đầu cuối và ... Làm thế nào để bạn mở thiết bị đầu cuối? Tôi không thấy nút "Mở thiết bị đầu cuối" trên liên kết
fortesl

Đảm bảo rằng bạn đang ở trên cloudmiền phụ, không phải miền phụ firebase("console.cloud.google.com/home") và tìm >_nút biểu tượng ở trên cùng bên phải.
Chris Villa

1

một cách tiếp cận khác để thực hiện việc này là sử dụng API JSON của Google. bước 1: nhận mã thông báo truy cập để sử dụng với JSON API Để nhận mã thông báo sử dụng, hãy truy cập: https://developers.google.com/oauthplayground/ Sau đó tìm kiếm API JSON hoặc Bộ nhớ Chọn các tùy chọn bắt buộc tức là đọc, ghi, full_access (đánh dấu vào những bắt buộc phải có) Thực hiện theo quy trình để nhận Mã truy cập, mã này sẽ có hiệu lực trong một giờ. Bước 2: Sử dụng mã thông báo để truy cập API JSON của google để cập nhật CORS

Curl mẫu:

    curl -X PATCH \
  'https://www.googleapis.com/storage/v1/b/your_bucket_id?fields=cors' \
  -H 'Accept: application/json' \
  -H 'Accept-Encoding: gzip, deflate' \
  -H 'Authorization: Bearer ya29.GltIB3rTqQ2tJgh0cMj1SEa1UgQNJnTMXUjMlMIRGG-mBCbiUO0wqdDuEpnPD6cbkcr1CuLItuhaNCTJYhv2ZKjK7yqyIHNgkCBup-T8Z1B1RiBrCgcgliHOGFDz' \
  -H 'Content-Type: application/json' \
  -H 'Postman-Token: d19f29ed-2e80-4c34-85ee-c46c9058fac0' \
  -H 'cache-control: no-cache' \
  -d '{
  "location": "us",
  "storageClass": "Standard",
  "cors": [
      {
          "maxAgeSeconds": "360000000",
          "method": [
             "GET",
             "HEAD",
             "DELETE"
          ],
          "origin": [
             "*"
          ],
          "responseHeader":[
            "Content-Type"
         ]
      }
  ]
}'

0

Tôi muốn nói thêm cho những người đang rất cần một giải pháp như tôi sau khi thử tất cả những điều này và không giải quyết được vấn đề. Tôi đã tìm thấy một bài báo trực tuyến tuyệt vời cung cấp 3 giải pháp và giải pháp đầu tiên phù hợp với tôi .. một plugin google chrome .. yeap! ..

moesif CORS extension Đảm bảo sau khi cài đặt, bạn BẬT nó lên


2
Điều này không thực sự giải quyết vấn đề cho người dùng không xác định ngoài thực địa - chỉ cho một máy duy nhất.
Elemental

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.