Devido à política de mesma origem dos navegadores, solicitações de origem cruzada podem ser rejeitadas durante a troca de dados ou o compartilhamento de recursos entre domínios diferentes. Para resolver esse problema, configure regras de compartilhamento de recursos de origem cruzada (CORS). Nessas regras, especifique os domínios permitidos para envio de solicitações, os métodos HTTP aceitos e os cabeçalhos autorizados.
Observações
Este tópico utiliza o endpoint público da região China (Hangzhou). Caso precise acessar o OSS a partir de outros serviços da Alibaba Cloud na mesma região, utilize um endpoint interno. Para mais informações sobre regiões e endpoints do OSS, consulte Regiões e endpoints.
O exemplo abaixo demonstra como criar uma instância OSSClient com um endpoint do OSS. Para outras configurações, como uso de domínio personalizado ou autenticação via Security Token Service (STS), consulte Criar uma instância OssClient.
Para configurar regras CORS, você deve ter a permissão
oss:PutBucketCors. Para consultar regras CORS, você deve ter a permissãooss:GetBucketCors. Para excluir regras CORS, você deve ter a permissãooss:DeleteBucketCors. Para mais informações, consulte Conceder uma política personalizada.
Defina regras de compartilhamento de recursos de origem cruzada
O código de exemplo a seguir mostra como configure 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 de origem cruzada
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;
}
Exclua regras de compartilhamento de recursos de origem cruzada
O código de exemplo a seguir mostra como exclua 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 de compartilhamento de recursos de origem cruzada, consulte o exemplo no GitHub.
Para obter mais informações sobre a operação de API usada para configure regras CORS, consulte PutBucketCors.
Para obter mais informações sobre a operação de API usada para consultar regras CORS, consulte GetBucketCors.
Para obter mais informações sobre a operação de API usada para exclua regras CORS, consulte DeleteBucketCors.