Devido à política de mesma origem dos navegadores, requisições entre origens diferentes podem ser rejeitadas durante a troca de dados ou o compartilhamento de recursos entre domínios distintos. Para resolver esse problema, configure regras de compartilhamento de recursos entre origens (CORS). Nas regras CORS, você pode especificar os domínios autorizados a enviar requisições, os métodos permitidos para requisições entre origens e os cabeçalhos aceitos.
Observações
Este tópico usa o endpoint público da região China (Hangzhou). Para acessar o OSS a partir de outros serviços Alibaba Cloud na mesma região, use um endpoint interno. Para mais informações sobre regiões e endpoints do OSS, consulte Regions and endpoints.
Este tópico demonstra como criar uma instância OSSClient com um endpoint do OSS. Para configurações alternativas, como uso de domínio personalizado ou autenticação com credenciais do Security Token Service (STS), consulte Create an OssClient instance.
Para configurar regras CORS, você precisa da permissão
oss:PutBucketCors. Para consultar regras CORS, você precisa da permissãooss:GetBucketCors. Para excluir regras CORS, você precisa da permissãooss:DeleteBucketCors. Para mais informações, consulte Grant a custom policy.
Definir regras de compartilhamento de recursos entre origens
O código de exemplo a seguir mostra como configurar uma regra CORS para um bucket específico:
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Initialize OSS account information. */
/* Set yourEndpoint to the Endpoint of the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the Endpoint to https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Set yourRegion to the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the Region to cn-hangzhou. */
std::string Region = "yourRegion";
/* Set the bucket name. Example: examplebucket. */
std::string BucketName = "examplebucket";
/* Initialize network resources. */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
SetBucketCorsRequest request(BucketName);
/* Set CORS rules. */
auto rule1 = CORSRule();
/* Specify the allowed origins for cross-origin requests. */
rule1.addAllowedOrigin("http://example.com");
/* Specify the allowed methods for cross-origin requests (GET, PUT, POST, DELETE, or HEAD). */
rule1.addAllowedMethod("POST");
/* Specify whether to allow the headers specified by the Access-Control-Request-Headers header in the preflight (OPTIONS) request. */
rule1.addAllowedHeader("*");
/* Specify the response headers that users can access from applications. */
rule1.addExposeHeader("x-oss-test");
/* Specify a maximum of 10 rules. */
request.addCORSRule(rule1);
auto rule2 = CORSRule();
rule2.addAllowedOrigin("http://example.net");
rule2.addAllowedMethod("GET");
rule2.addExposeHeader("x-oss-test2");
rule2.setMaxAgeSeconds(100);
request.addCORSRule(rule2);
auto outcome = client.SetBucketCors(request);
if (!outcome.isSuccess()) {
/* Handle exceptions. */
std::cout << "SetBucketCors fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* Release network resources. */
ShutdownSdk();
return 0;
}
Obter regras de compartilhamento de recursos entre origens
O código de exemplo a seguir mostra como consultar as regras CORS de um bucket específico:
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Initialize OSS account information. */
/* Set yourEndpoint to the Endpoint of the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the Endpoint to https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Set yourRegion to the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the Region to cn-hangzhou. */
std::string Region = "yourRegion";
/* Set the bucket name. Example: examplebucket. */
std::string BucketName = "examplebucket";
/* Initialize network resources. */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* Get CORS rules. */
auto outcome = client.GetBucketCors(BucketName);
if (outcome.isSuccess()) {
std::cout << "GetBucketCors success" << std::endl;
for (auto const rule : outcome.result().CORSRules()) {
std::cout << "Get Bucket Cors List:" << std::endl;
for (auto const origin : rule.AllowedOrigins()) {
std::cout << "Allowed origin:" << origin << std::endl;
}
}
}
else {
/* Handle exceptions. */
std::cout << "GetBucketCors fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* Release network resources. */
ShutdownSdk();
return 0;
}
Excluir regras de compartilhamento de recursos entre origens
O código de exemplo a seguir mostra como excluir todas as regras CORS de um bucket específico:
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Initialize OSS account information. */
/* Set yourEndpoint to the Endpoint of the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the Endpoint to https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Set yourRegion to the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the Region to cn-hangzhou. */
std::string Region = "yourRegion";
/* Set the bucket name. Example: examplebucket. */
std::string BucketName = "examplebucket";
/* Initialize network resources. */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* Delete CORS rules. */
auto outcome = client.DeleteBucketCors(BucketName);
if (!outcome.isSuccess()) {
/* Handle exceptions. */
std::cout << "DeleteBucketCors fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* Release network resources. */
ShutdownSdk();
return 0;
}
Referências
Para obter o código de exemplo completo sobre compartilhamento de recursos entre origens, consulte Exemplo no GitHub.
Para mais informações sobre a operação de API que configura regras CORS, consulte PutBucketCors.
Para mais informações sobre a operação de API que consulta regras CORS, consulte GetBucketCors.
Para mais informações sobre a operação de API que exclui regras CORS, consulte DeleteBucketCors.