我正在使用AWS创建一个已签名的URL,因此我可以安全地将此URL传递给另一个API以供临时使用。签名的URL指向S3资源。问题是其他API不接受这样的长链接。所以我试图缩短它。我尝试使用goo.gl或bit.ly这样的缩写词无效,因为网址太长了。我甚至使用AWS(AWS url shortener)构建了自己的私有缩短程序,但它遇到了同样的问题:“网站重定向位置的长度不能超过2,048个字符。”。
我在使用AWS Cognito作为未经授权的用户时,使用AWSS3PreSignedURLBuilder.default().getPreSignedURL(preSignedURLRequest)
在iOS(Swift)中创建了已签名的URL。
我尝试过以下事情无济于事:
但即使进行了所有这些小调整,AWS返回的签名URL有时也会太长。特别是令牌参数(X-Amz-Security-Token)似乎真的很长。通过我的小调整,我有时会得到短于2,048个字符的URL,但有时会略长一些。我想找到一个解决方案,保证URL不会太长,可以缩短。
在我自己的私人AWS URL缩短器中,以下代码段创建了一个S3对象,该对象重定向到实际的长URL。
s3.putObject({
Bucket: s3_bucket,
Key: key_short,
Body: "",
WebsiteRedirectLocation: url_long,
ContentType: "text/plain"
},
(err, data) => {
if (err) {
console.log(err);
done("", err.message);
} else {
const ret_url = "https://" + cdn_prefix + "/" + id_short;
console.log("Success, short_url = " + ret_url);
done(ret_url, "");
}
});
该方法返回错误
网站重定向位置的长度不能超过2,048 字符。
对象元中头文件“x-amz-website -redirect-location”的putObject文档说明了以下内容(see: put object documentation):
值的长度限制为2 KB
如何确保初始AWS签名网址对于网址缩短程序而言不会太长?
修改
我发现的一个问题是我在AWS Cognito中将签名的URL创建为未经身份验证的用户。因此,签名的URL包含这个可笑的长令牌作为参数。我不想在iOS应用程序中嵌入我的accessKey和shortKey,这就是我切换到AWS Cognito的原因(参见aws cognito)。但目前没有授权用户只是未经授权的用户,我需要将签名的URL创建为未经授权的AWS Cognito用户。如果我使用accessKey和shortKey使用常规凭据创建签名URL,我会得到一个更短的URL。但为此我不得不在iOS应用程序中嵌入我的accessKey和shortKey,这是不推荐的。
答案 0 :(得分:0)
有一种较早的方法可以生成预先签名的URL,从而产生一个非常短的链接,例如:
然而,这是在sigv4之前的日期,因此在新区域(法兰克福以后)不起作用。
您可以在以下网址找到示例代码:
答案 1 :(得分:0)
我通过创建AWS lambda来创建预签名URL并返回预签名URL来解决问题。预签名URL允许调用者访问(getObject)S3资源。关于此,有两种选择:
我在我的iOS应用程序中将此lambda称为未经授权的认知用户。从AWS lambda收到预先签名的URL后,我可以缩短它,因为使用这种方法,预先签名的URL要短得多。