AWS签名的网址太长,无法缩短

时间:2017-10-21 15:49:19

标签: amazon-web-services url amazon-s3 url-redirection url-shortener

我正在使用AWS创建一个已签名的URL,因此我可以安全地将此URL传递给另一个API以供临时使用。签名的URL指向S3资源。问题是其他API不接受这样的长链接。所以我试图缩短它。我尝试使用goo.glbit.ly这样的缩写词无效,因为网址太长了。我甚至使用AWS(AWS url shortener)构建了自己的私有缩短程序,但它遇到了同样的问题:“网站重定向位置的长度不能超过2,048个字符。”。

我在使用AWS Cognito作为未经授权的用户时,使用AWSS3PreSignedURLBuilder.default().getPreSignedURL(preSignedURLRequest)在iOS(Swift)中创建了已签名的URL。

我尝试过以下事情无济于事:

  • 选择包含3个字符的最短S3存储桶名称
  • 尽可能缩短文件名。我将文件名限制为10个字符加上文件扩展名(总共14个字符)。较短的文件名对我来说不可行,因为它们在某种程度上应该是唯一的。

但即使进行了所有这些小调整,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,这是不推荐的。

2 个答案:

答案 0 :(得分:0)

有一种较早的方法可以生成预先签名的URL,从而产生一个非常短的链接,例如:

https://s3-ap-southeast-2.amazonaws.com/my-bucket/foo.png?AWSAccessKeyId=AKI123V12345RYTP123&Expires=1508620600&Signature=oB1/jca2JFXw5DbN7gBKEXkUQk8%3D

然而,这是在sigv4之前的日期,因此在新区域(法兰克福以后)不起作用。

您可以在以下网址找到示例代码:

答案 1 :(得分:0)

我通过创建AWS lambda来创建预签名URL并返回预签名URL来解决问题。预签名URL允许调用者访问(getObject)S3资源。关于此,有两种选择:

  1. 分配给AWS lambda的角色具有getObject的S3权限。生成的预签署URL将包含比使用AWS app在iOS应用程序中发布的临时凭证创建的预签名URL更短的令牌。
  2. 将具有对getObject的S3权限的角色的访问密钥和密钥直接嵌入到AWS lambda中,这将为您提供更短的URL,因为生成的预签名URL中不包含任何令牌。 (例如BalusC's excellent troubleshooting tool
  3. 我在我的iOS应用程序中将此lambda称为未经授权的认知用户。从AWS lambda收到预先签名的URL后,我可以缩短它,因为使用这种方法,预先签名的URL要短得多。