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:
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:
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:
Wstaw uzyskany wcześniej link: https://s3.waw2-1.cloudferro.com/swift/v1/AUTH_8b72c381c7724c44b971e6a5862a0b94/container-nr-1/
Teraz kliknij przycisk „Submit”:
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.
Powyższy ekran pokazuje, że funkcja CORS została włączona.