Skip to main content
  • »
  • NETWORKING »
  • Jak włączyć CORS podczas uzyskiwania dostępu do kontenerów Object Storage w NSIS?

Jak włączyć CORS podczas uzyskiwania dostępu do kontenerów Object Storage w NSIS?

Jeśli chcesz uzyskać dostęp do obiektów w kontenerze Object Store z innej domeny, napotkasz problem CORS. CORS oznacza Cross-Origin Resource Sharing i jest standardem, który służy do rozluźnienia polityki tego samego pochodzenia dla strony internetowej. Przykładami problemów związanych z CORS to:

  • Nie można dodać nagłówka „Origin”

  • Brak nagłówka „Access-Control-Allow-Origin”

  • Zapytanie preflight CORS nie powiodło się

i wiele innych.

W tym artykule pokażemy, jak skonfigurować kontener, aby włączyć CORS.

Załóżmy, że w kontenerze są już utworzone dwa pliki:

../_images/nwt_image1.png

Jeśli kontener jest publiczny, po zaznaczeniu pola wyboru Public Access, można uzyskać link do obiektów, klikając Link.

Następnie można uzyskać dostęp do obiektów, wstawiając link, na przykład https://s3.waw2-1.cloudferro.com/swift/v1/AUTH_8b72c381c7724c44b971e6a5862a0b94/container-nr-1/), do przeglądarki:

../_images/nwt_pasted_image002.png

Będziemy symulować problem CORS przy użyciu pliku z artykułu OpenStack:

https://docs.openstack.org/swift/latest/cors.html#test-cors-page

Plik wygląda następująco:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Test CORS</title>
  </head>
  <body>

    Token<br><input id="token" type="text" size="64"><br><br>

    Method<br>
    <select id="method">
        <option value="GET">GET</option>
        <option value="HEAD">HEAD</option>
        <option value="POST">POST</option>
        <option value="DELETE">DELETE</option>
        <option value="PUT">PUT</option>
    </select><br><br>

    URL (Container or Object)<br><input id="url" size="64" type="text"><br><br>

    <input id="submit" type="button" value="Submit" onclick="submit(); return false;">

    <pre id="response_headers"></pre>
    <p>
    <hr>
    <pre id="response_body"></pre>

    <script type="text/javascript">
      function submit() {
          var token = document.getElementById('token').value;
          var method = document.getElementById('method').value;
          var url = document.getElementById('url').value;

          document.getElementById('response_headers').textContent = null;
          document.getElementById('response_body').textContent = null;

          var request = new XMLHttpRequest();

          request.onreadystatechange = function (oEvent) {
              if (request.readyState == 4) {
                  responseHeaders = 'Status: ' + request.status;
                  responseHeaders = responseHeaders + '\nStatus Text: ' + request.statusText;
                  responseHeaders = responseHeaders + '\n\n' + request.getAllResponseHeaders();
                  document.getElementById('response_headers').textContent = responseHeaders;
                  document.getElementById('response_body').textContent = request.responseText;
              }
          }

          request.open(method, url);
          if (token != '') {
              // custom headers always trigger a pre-flight request
              request.setRequestHeader('X-Auth-Token', token);
          }
          request.send(null);
      }
    </script>

  </body>
</html>

Otwórz plik w przeglądarce:

../_images/nwt_test_cors.png

Wstaw uzyskany wcześniej link: https://s3.waw2-1.cloudferro.com/swift/v1/AUTH_8b72c381c7724c44b971e6a5862a0b94/container-nr-1/

Teraz kliknij przycisk „Submit”:

../_images/nwt_pasted_image003.png

Jeśli otworzysz konsolę w przeglądarce, zobaczysz komunikat informujący, że dostęp został zablokowany.

Teraz przygotuj środowisko Python zgodnie z jednym z tych artykułów:

i uzyskaj plik RC:

$ source jdoe-test.sh
Please enter your OpenStack Password for project test_project as user [email protected]:

Możesz sprawdzić, czy widzisz kontener i obiekty, wywołując następujące polecenia:

$ openstack container list
+----------------+
| Name           |
+----------------+
| container-nr-1 |
+----------------+

$ openstack object list container-nr-1
+---------------+
| Name          |
+---------------+
| file-nr-1.txt |
| file-nr-2.txt |
+---------------+

Teraz należy wygenerować poświadczenia EC2 zgodnie z artykułem:

Jak wygenerować poświadczenia EC2 i zarządzać nimi na NSIS Cloud

$ openstack ec2 credentials create -f json
{
  "access": "<access code>",
  "access_token_id": null,
  "links": {
    "self": "https://cf2.cloudferro.com:5000/v3/users/<user id>/credentials/OS-EC2/<access code>"
  },
  "project_id": "8b72c381c7724c44b971e6a5862a0b94",
  "secret": "<secret code>",
  "trust_id": null,
  "user_id": "<user id>"
}

Konfiguracja s3cmd

Musisz utworzyć plik konfiguracyjny, np. jdoe-test-s3cfg, z następującą zawartością:

location = US
access_key = <access code>
host_base = s3.waw2-1.cloudferro.com
host_bucket = s3.waw2-1.cloudferro.com
secret_key = <secret code>

Teraz możesz sprawdzić właściwości swojego kontenera:

$ s3cmd -c jdoe-test-s3cfg info s3://container-nr-1
s3://container-nr-1/ (bucket):
   Location:  dias_default
   Payer:     BucketOwner
   Expiration Rule: none
   Policy:    none
   CORS:      none
   ACL:       test_project: FULL_CONTROL

Teraz przygotuj kolejny plik: cors.xml

<CORSConfiguration>
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

i wykonaj następujące polecenie:

$ s3cmd -c jdoe-test-s3cfg setcors cors.xml s3://container-nr-1

Teraz sprawdź właściwości kontenera:

$ s3cmd -c jdoe-test-s3cfg info s3://container-nr-1
s3://container-nr-1/ (bucket):
   Location:  dias_default
   Payer:     BucketOwner
   Expiration Rule: none
   Policy:    none
   CORS:      <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><CORSRule><AllowedMethod>GET</AllowedMethod><AllowedOrigin>*</AllowedOrigin><AllowedHeader>*</AllowedHeader></CORSRule></CORSConfiguration>
   ACL:       test_project: FULL_CONTROL

i ponownie przetestuj plik cors-test.html.

../_images/nwt_pasted_image004.png

Powyższy ekran pokazuje, że funkcja CORS została włączona.