2013-01-22 5 views
1

Quelqu'un peut-il fournir un exemple pour les fichiers nuage de Rackspace tempurl fonction .net (C# ou vb.net)?Rackspace Cloud File (OpenStack Swift) TempUrl Exemple dans vb.net

Il y a une documentation sur le site Rackspace à: http://docs.rackspacecloud.com/files/api/v1/cf-devguide/cf-devguide-20121130.pdf partir de la page 52.

Il y a des exemples dans Ruby et Python, mais je ne parviens pas les porter. Je dois:

  • Définissez l'URL Temp compte métadonnées clés
    • Créer HMAC-SHA1 (RFC 2104)
    • Créer l'url temp

Répondre

2

La volonté suivante générer une URL temporaire avec C#:

 var account = new CF_Account(conn, client); 

     string tempUrlKey = account.Metadata["temp-url-key"]; 

     //Set the link to expire after 60 seconds (in epoch time) 
     int epochExpire = ((int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds) + 60; 

     //The path to the cloud file 
     string path = string.Format("{0}/{1}/{2}", account.StorageUrl.AbsolutePath, containerName, fileName); 

     string hmacBody = string.Format("GET\n{0}\n{1}", epochExpire.ToString(), path); 

     byte[] hashSaltBytes = Encoding.ASCII.GetBytes(tempUrlKey); 

     string sig = null; 

     using (HMACSHA1 myhmacMd5 = new HMACSHA1(hashSaltBytes)) 
     { 
      byte[] ticketBytes = Encoding.ASCII.GetBytes(hmacBody); 
      byte[] checksum = myhmacMd5.ComputeHash(ticketBytes); 

      StringBuilder hexaHash = new StringBuilder(); 

      foreach (byte b in checksum) 
      { 
       hexaHash.Append(String.Format("{0:x2}", b)); 
      } 

      sig = hexaHash.ToString(); 
     } 

     string cloudFileUrl = string.Format("https://{0}{1}", account.StorageUrl.Host, path); 

     //Compile the temporary URL 
     string tempUrl = string.Format("{0}?temp_url_sig={1}&temp_url_expires={2}", cloudFileUrl, sig, epochExpire); 
2

la réponse de Athlectual ne semble pas appliquer à l'ensemble NuGet courant openstack.net, mais je l'ai réussi à le faire fonctionner avec la dernière version (1.1.2.1) par essais et erreurs. Espérons que cela aidera les autres

Dans mon cas, il semble que je ne devais pas définir l'URL Temp métadonnées clés comme l'un était déjà défini, doit être généré de manière aléatoire lorsque le compte a été créé. Donc, le code pour obtenir l'URL temp qui fonctionne est le suivant.

N.B. J'ai utilisé Nom d'utilisateur et APIKey pour m'authentifier. Je suppose que vous pouvez utiliser le mot de passe à la place. APIKey peut être trouvé sous les détails de votre compte sur le site Web Rackspace Cloud Control Panel.

private static string GetCloudFilesTempUrl(Uri storageUrl, string username, string apiKey, string containerName, string filename) 
{ 
    var cloudIdentity = new CloudIdentity() 
     { 
      Username = username, 
      APIKey = apiKey 
     }; 

    var provider = new CloudFilesProvider(cloudIdentity); 

    var accountMetaData = provider.GetAccountMetaData(); 
    var tempUrlKey = accountMetaData["Temp-Url-Key"]; 

    //Set the link to expire after 60 seconds (in epoch time) 
    var epochExpire = ((int) (DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds) + 60; 

    //The path to the cloud file 
    var path = string.Format("{0}/{1}/{2}", storageUrl.AbsolutePath, containerName, filename); 

    var hmacBody = string.Format("GET\n{0}\n{1}", epochExpire, path); 

    var hashSaltBytes = Encoding.ASCII.GetBytes(tempUrlKey); 

    string sig; 

    using (var myhmacMd5 = new HMACSHA1(hashSaltBytes)) 
    { 
     var ticketBytes = Encoding.ASCII.GetBytes(hmacBody); 
     var checksum = myhmacMd5.ComputeHash(ticketBytes); 

     var hexaHash = new StringBuilder(); 

     foreach (var b in checksum) 
     { 
      hexaHash.Append(String.Format("{0:x2}", b)); 
     } 

     sig = hexaHash.ToString(); 
    } 

    var cloudFileUrl = string.Format("https://{0}{1}", storageUrl.Host, path); 

    //Compile the temporary URL 
    return string.Format("{0}?temp_url_sig={1}&temp_url_expires={2}", cloudFileUrl, sig, epochExpire); 
} 

Je ne sais pas comment vous êtes censé obtenir l'URL de stockage, mais à travers tâtonne plus j'ai réussi ceci:

private static string GetCloudFilesStorageUrl(string username, string apiKey) 
{ 
    var cloudIdentity = new CloudIdentity() 
    { 
     Username = username, 
     APIKey = apiKey 
    }; 

    var identityProvider = new CloudIdentityProvider(cloudIdentity); 

    return identityProvider.GetUserAccess(cloudIdentity) 
          .ServiceCatalog 
          .Single(x => x.Name == "cloudFiles") 
          .Endpoints[0].PublicURL; 
} 

Comme mentionné, je ne devais pas régler la Temp URL Key, et je ne vais probablement pas essayer au cas où je casse quelque chose qui fonctionne! Si vous avez besoin si je suppose que ce qui suit devrait faire l'affaire:

private static void SetCloudFilesTempUrlKey(string username, string apiKey, string tempUrlKey) 
{ 
    var cloudIdentity = new CloudIdentity() 
     { 
      Username = username, 
      APIKey = apiKey 
     }; 

    var provider = new CloudFilesProvider(cloudIdentity); 

    provider.UpdateAccountMetadata(new Metadata 
     { 
      { "Temp-Url-Key", tempUrlKey } 
     }); 
} 
Questions connexes