如何使用REST API为Swift对象存储创建临时URL?

时间:2016-05-05 10:21:42

标签: ibm-cloud openstack openstack-swift

Swift对象存储允许您为具有到期日期的任何资源创建临时URL。这可以通过swift CLI命令行实现。为了在Web应用程序中使用此功能,我需要使用API​​调用来创建临时URL,这样我就可以休息CALL并获取临时URL,以后可以嵌入HTML和我们下载的资源中浏览器直接。

从文档中我看不到为此提到的任何API?有谁知道如何使用API​​调用从Java获取它。

由于 的Manoj

2 个答案:

答案 0 :(得分:2)

没有可用于为Swift对象生成临时URL的直接API。相反,它必须在{strong> X-Account-Meta-Temp-URL-Key 密钥的帮助下从客户端生成,如this document

中所述

这是生成它的代码的python版本。请参考这个以Java重新实现它,然后它可以嵌入任何地方。

import hmac
from hashlib import sha1
from time import time
method = 'GET'
duration_in_seconds = 60*60*24
expires = int(time() + duration_in_seconds)
path = '/v1/AUTH_a422b2-91f3-2f46-74b7-d7c9e8958f5d30/container/object'
key = 'mykey'
hmac_body = '%s\n%s\n%s' % (method, expires, path)
sig = hmac.new(key, hmac_body, sha1).hexdigest()
s = 'https://{host}/{path}?temp_url_sig={sig}&temp_url_expires={expires}'
url = s.format(host='swift-cluster.example.com', path=path, sig=sig, expires=expires)

这是一个another reference,它是对Openstack Horizo​​n进行的自定义,提供用于生成swift对象临时URL的UI功能。

答案 1 :(得分:1)

对于在java中寻找答案的其他人,下面是在java中获取hmac的代码片段

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SignatureException;
import java.util.Formatter;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

 private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";

        private static String toHexString(byte[] bytes) {
            Formatter formatter = new Formatter();

            for (byte b : bytes) {
                formatter.format("%02x", b);
            }

            return formatter.toString();
        }

        public static String calculateRFC2104HMAC(String data, String key)
            throws SignatureException, NoSuchAlgorithmException, InvalidKeyException
        {
            SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM);
            Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
            mac.init(signingKey);
            return toHexString(mac.doFinal(data.getBytes()));
        }

以上代码取自https://gist.github.com/ishikawa/88599

使用hmac根据以下代码

创建临时URL
Long expires = (System.currentTimeMillis()/1000)+ <expiry in seconds>;
String tempURL=""+baseURL+path+"?temp_url_sig="+hmac+"&  temp_url_expires="+expires;

由于