AWS 签名 URL 太长无法缩短

AWS signed URL too long to shorten

我正在使用 AWS 创建签名的 URL,这样我就可以安全地将此 URL 传递给另一个 API 以供临时使用。已签名的 URL 指向 S3 资源。问题是其他 API 不接受这么长的链接。因此,我试图缩短它。我尝试使用像 goo.gl or bit.ly to no avail because the URL was too long for them. I even built my own private shortener with AWS (AWS url shortener) 这样的缩短器,但它有同样的问题:"The length of website redirect location cannot exceed 2,048 characters.".

我正在使用 AWSS3PreSignedURLBuilder.default().getPreSignedURL(preSignedURLRequest) 在 iOS (Swift) 中创建签名的 URLs,同时将 AWS Cognito 作为未授权用户使用。

我试过以下方法都无济于事:

但即使进行了所有这些小调整,AWS 返回的已签名 URL 有时还是太长。特别是令牌参数(X-Amz-Security-Token)似乎真的很长。通过我的小调整,有时 URLs 会短于 2,048 个字符,但有时会稍长一些。我想找到一个解决方案来保证 URL 不会太长并且可以缩短。

在我自己的私人 AWS URL shortener 中,以下代码片段创建了 S3 object,它重定向到实际的 long 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, "");
    }
  });

方法returns有如下错误

The length of website redirect location cannot exceed 2,048 characters.

object 元中 header "x-amz-website​-redirect-location" 的 putObject 文档说明如下 (see: put object documentation):

The length of the value is limited to 2 KB

如何确保初始 AWS 签名 URL 对于 URL 缩短器来说不会太长?

编辑:

我发现的一个问题是,我在 AWS Cognito 中将已签名的 URL 创建为未经身份验证的用户。因此,已签名的 URL 将这个长得离谱的标记作为参数包含在内。我不想将我的 accessKey 和 shortKey 嵌入 iOS 应用程序中,这就是我切换到 AWS Cognito 的原因(参见 aws cognito)。但是目前没有授权用户只有未经授权的用户,我需要创建签名 URL 作为未经授权的 AWS Cognito 用户。如果我使用 accessKey 和 shortKey 创建带有常规凭据的签名 URL,我会得到一个更短的 URL。但是为此,我必须将我的 accessKey 和 shortKey 嵌入到不推荐的 iOS 应用程序中。

有一种生成预签名 URL 的旧方法会生成非常短的 link,例如:

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

但是,它早于 sigv4,所以它在较新的区域(从法兰克福开始)不起作用。

您可以在以下位置找到示例代码:

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

  1. 分配给AWS lambda的角色拥有getObject的S3权限。与使用 AWS Cognito 在 iOS 应用程序中发布的临时凭证创建的预签名 URL 相比,生成的预签名 URL 包含的令牌要短得多。
  2. 将具有 getObject 的 S3 权限的角色的访问密钥和秘密密钥直接嵌入到 AWS lambda 中,这将使您的 URL 更短,因为生成的预签名 URL。 (例如

我在我的 iOS 应用程序中将此 lambda 称为未经授权的 Cognito 用户。从 AWS lambda 接收到预签名的 URL 后,我可以缩短它,因为使用这种方法预签名的 URL 更短。