Interface do Amazon S3 em um monobomportamento de unidade C #

Abaixo está meu método de trabalho para enviar uma solicitação GET do Amazon AWS S3 para um item de balde. Isso também pode ser modificado para se comunicar de outras maneiras com o S3 usando GET.

static readonly string BUCKET = "bucket-name";

static readonly string AWS_ACCESS_KEY_ID ="1A1A1A1A1A1A1A1A1A1A";
static readonly string AWS_SECRET_ACCESS_KEY ="1Ab1Ab1Ab1Ab1Ab1Ab1Ab1Ab1Ab1Ab1Ab1Ab1Ab1";

static readonly string AWS_S3_URL_BASE_VIRTUAL_HOSTED = "https://"+BUCKET+".s3.amazonaws.com/";
static readonly string AWS_S3_URL_BASE_PATH_HOSTED = "https://s3.amazonaws.com/"+BUCKET+"/";
static readonly string AWS_S3_URL = AWS_S3_URL_BASE_VIRTUAL_HOSTED;

void SendAmasonS3Request(string itemName)
{
Hashtable headers = new Hashtable();

string dateString =
System.DateTime.UtcNow.ToString("ddd, dd MMM yyyy HH:mm:ss ") + "GMT";
headers
.Add("x-amz-date", dateString);
Debug.Log("Date: " + dateString);

string canonicalString = "GETnnnnx-amz-date:" + dateString + "n/" + BUCKET + "/" + itemName;

// now encode the canonical string
var ae = new System.Text.UTF8Encoding();
// create a hashing object
HMACSHA1 signature
= new HMACSHA1();
// secretId is the hash key
signature
.Key = ae.GetBytes(AWS_SECRET_ACCESS_KEY);
byte[] bytes = ae.GetBytes(canonicalString);
byte[] moreBytes = signature.ComputeHash(bytes);
// convert the hash byte array into a base64 encoding
string encodedCanonical = System.Convert.ToBase64String(moreBytes);

// finally, this is the Authorization header.
headers
.Add("Authorization", "AWS " + AWS_ACCESS_KEY_ID + ":" + encodedCanonical);

// The URL, either PATH_HOSTED or VIRTUAL_HOSTED, plus the item path in the bucket
string url = AWS_S3_URL + itemName;

// Setup the request url to be sent to Amazon
WWW www
= new WWW(url, null, headers);

// Send the request in this coroutine so as not to wait busily
StartCoroutine(WaitForRequest(www));
}



IEnumerator WaitForRequest(WWW www)
{
yield return www;

// Check for errors
if(www.error == null)
{
ParseResponse(www.text, www.url);
}
else
{
Debug.Log("WWW Error: "+ www.error+" for URL: "+www.url);
ProcessAmazonS3Error(www);
}
}

Em primeiro lugar, “itemName” é o item ~ caminho ~ completo em meu intervalo (excluindo o nome do intervalo em si), no meu caso algo como “ItemCategory / 123”.

A comunicação com Amazon Web Services a partir do Unity requer o uso da classe WWW para enviar a URL, especificamente o construtor que leva um Hashtable, aqui chamado de “cabeçalhos”.

A URL pode ser “hospedada no caminho” ou “hospedada virtual”, ambas as quais incluí nas constantes para que você veja a diferença. o caminho hospedado tem o intervalo anexado ao final e o virtual hospedado tem o intervalo como parte do domínio.

Os cabeçalhos, no caso de GETting an Object, consistem em (1) a string DateTime especificamente formatada e (2) a assinatura de autorização REST.

O formato de data e hora é descrito acima e usa a substituição de ToString em UtcNow. É adicionado a “cabeçalhos” como “data-x-amz”

A assinatura de autorização REST é muito mais complexa e cada palavra, espaço e “/” são absolutamente essenciais. A maneira como isso funciona é que, com base no URL de sua solicitação, a AWS calculará a assinatura que espera de sua CHAVE DE ACESSO e SEGREDOKEY e compare-a com a assinatura enviada no cabeçalho da solicitação. Para entender o que está acontecendo, primeiro consulte “canonicalString”, que descreve a solicitação usando a sintaxe de assinatura de autorização REST descrita na documentação REST do AWS S3. Existe o verbo, GET, seguido por várias novas linhas para pular o conteúdo MD5, Content-type e “Date”. O próximo campo é Amz-headers, onde estou atribuindo o cabeçalho “x-amz-date”. Em seguida é uma nova linha para ir para o próximo ~ argumento ~ na assinatura, mas também um “/” porque o “Recurso canonizado” deve começar com um “/”. Em seguida, independentemente de você estar usando PATH HOSTED ou VIRTUALHOSTED, você DEVE formular a solicitação com o nome do intervalo, “/” e, em seguida, o caminho do objeto no intervalo. Esta string é codificada com base em SECRET_KEY usando HMACSHA1 e hashes de computação. A string codificada é adicionada a “cabeçalhos” como “Autorização”.

O URL final deve, então, ter o caminho do objeto dentro do intervalo anexado a ele. O URL deve solicitar o mesmo objeto que a assinatura foi codificada.

o construtor de WWW deve ser a forma de 3 argumentos tomando (1) o url, (2) um nulo para os “bytes”, uma vez que não estamos fazendo o POST, e (3) os cabeçalhos contendo a string de data e a assinatura de autorização REST.

A co-rotina é um recurso do Unity que, em suma, permite verificar o estado da solicitação onde você pode reagir à sua conclusão, sem polling. Encontre mais sobre corrotinas e “rendimento” na documentação do Unity.

Aproveitar!

Respostas relacionadas:

PlayerPrefs aprimorados para Unity